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<RedisSessionStorage> _logger;
|
|
public RedisSessionStorage(
|
IRedisConnectionManager connectionManager,
|
IOptions<RedisOptions> options,
|
ILogger<RedisSessionStorage> 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);
|
}
|
}
|
}
|