为什么session id与redis key不匹配?

问题描述 投票:0回答:1

我使用 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 匹配。

我错过了什么?

c# asp.net-core redis distributed-caching
1个回答
0
投票

我也使用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); 
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.