我使用 redis 作为我在 net core 中的会话存储。
这是大多数文章的标准设置。
services.AddStackExchangeRedisCache(options =>
{
options.Configuration = host;
options.InstanceName = name;
});
这是我将值写入redis的代码。
private ISession Session => _httpContextAccessor.HttpContext.Session;
public async Task SetAsync<T>(string key, T value)
{
if (string.IsNullOrEmpty(key))
throw new ArgumentNullException("key and value must be provided");
try
{
await Session.LoadAsync();
Session.SetString(key, JsonConvert.SerializeObject(value));
await Session.CommitAsync();
}
catch
{
_logger.LogError("Session store unavailable cannot commit session");
}
}
如果我从 httpContext 读取 Session.Id 的值,我将获得预期的会话 id。
b0208014-03da-9fc2-e444-791aa5e5ab3c
但是使用redis-cli查看key,却找不到这个。为此,redis 密钥是:
“localc7c334a7-b3df-e981-438f-d5cadb0a904d”
我读过一篇文章,解释了实例名称作为密钥的前缀,但是,我读到的所有内容都建议其余部分应该与会话 ID 匹配。
我错过了什么?
我也使用redis服务器,但我从未见过这样的错误。我向您展示我的使用 Redis 的定制服务
另一方面,我更喜欢添加逻辑上类似的键, 如果您使用此键来获取驱动程序设置键(如“drivers”),您可以添加自定义方法来检查此键是否存在,如果不存在,则方法从任何 GetDrivers() 服务方法调用函数并将数据设置到 redis
在Program.cs中
builder.Services.AddStackExchangeRedisCache(redis =>
{
redis.InstanceName = host;
redis.Configuration = name;
});
builder.Services.AddScoped<ICacheService, CacheManger>();
在ICacheService中
public interface ICacheService
{
T GetData<T>(string key);
bool SetData<T>(string key,T data ,DateTimeOffset date);
bool RemoveData(string key);
}
在缓存管理器中
public sealed class CacheManger : ICacheService
{
private readonly ConnectionMultiplexer _connection;
private readonly IDatabase _cacheDb;
public CacheManger()
{
_connection = ConnectionMultiplexer.Connect(new ConfigurationOptions(){
EndPoints = {host},
ClientName = name,
});
_cacheDb = _connection.GetDatabase();
}
public T GetData<T>(string key)
{
var value = _cacheDb.StringGet(key);
if(value.HasValue)
return JsonSerializer.Deserialize<T>(value);
return default;
}
public bool RemoveData(string key)
{
if (_cacheDb.KeyExists(key))
return _cacheDb.KeyDelete(key);
return false;
}
public bool SetData<T>(string key, T data, DateTimeOffset date)
{
var expire = date.DateTime.Subtract(DateTime.Now);
return _cacheDb.StringSet(key,JsonSerializer.Serialize(data),expire);
}
}