using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using StackExchange.Redis; using WIDESEAWCS_RedisService.Connection; using WIDESEAWCS_RedisService.Options; using WIDESEAWCS_RedisService.Serialization; namespace WIDESEAWCS_RedisService.Storage { public class RedisObjectStorageService : IObjectStorageService { private readonly IRedisConnectionManager _connectionManager; private readonly IRedisSerializer _serializer; private readonly RedisOptions _options; private readonly ILogger _logger; public RedisObjectStorageService( IRedisConnectionManager connectionManager, IRedisSerializer serializer, IOptions options, ILogger logger) { _connectionManager = connectionManager; _serializer = serializer; _options = options.Value; _logger = logger; } private string BuildKey(string key) => $"{_options.KeyPrefix}obj:{key}"; public bool SetObject(string key, T value, TimeSpan? expiry = null) where T : class { var db = _connectionManager.GetDatabase(); var fullKey = BuildKey(key); var json = _serializer.Serialize(value); return db.StringSet(fullKey, json, expiry); } public T? GetObject(string key) where T : class { var val = _connectionManager.GetDatabase().StringGet(BuildKey(key)); return val.IsNullOrEmpty ? default : _serializer.Deserialize(val!); } public bool SetField(string key, string field, string value) { return _connectionManager.GetDatabase().HashSet(BuildKey(key), field, value); } public string? GetField(string key, string field) { var val = _connectionManager.GetDatabase().HashGet(BuildKey(key), field); return val.IsNullOrEmpty ? null : val.ToString(); } public bool Delete(string key) { return _connectionManager.GetDatabase().KeyDelete(BuildKey(key)); } public bool DeleteField(string key, string field) { return _connectionManager.GetDatabase().HashDelete(BuildKey(key), field); } public bool Exists(string key) { return _connectionManager.GetDatabase().KeyExists(BuildKey(key)); } } }