using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using StackExchange.Redis; using WIDESEAWCS_RedisService.Connection; using WIDESEAWCS_RedisService.Options; namespace WIDESEAWCS_RedisService.Session { public class RedisSessionStorage : ISessionStorage { private readonly IRedisConnectionManager _connectionManager; private readonly RedisOptions _options; private readonly ILogger _logger; public RedisSessionStorage( IRedisConnectionManager connectionManager, IOptions options, ILogger logger) { _connectionManager = connectionManager; _options = options.Value; _logger = logger; } private string BuildKey(string sessionId) => $"{_options.KeyPrefix}session:{sessionId}"; public bool Set(string sessionId, string key, string value, TimeSpan? expiry = null) { var db = _connectionManager.GetDatabase(); var fullKey = BuildKey(sessionId); db.HashSet(fullKey, key, value); if (expiry.HasValue) db.KeyExpire(fullKey, expiry); return true; } public string? Get(string sessionId, string key) { var val = _connectionManager.GetDatabase().HashGet(BuildKey(sessionId), key); return val.IsNullOrEmpty ? null : val.ToString(); } public bool Remove(string sessionId, string key) { return _connectionManager.GetDatabase().HashDelete(BuildKey(sessionId), key); } public bool DestroySession(string sessionId) { return _connectionManager.GetDatabase().KeyDelete(BuildKey(sessionId)); } public bool SessionExists(string sessionId) { return _connectionManager.GetDatabase().KeyExists(BuildKey(sessionId)); } public bool RefreshSession(string sessionId, TimeSpan expiry) { return _connectionManager.GetDatabase().KeyExpire(BuildKey(sessionId), expiry); } } }