【问题标题】:Using simple SET with StackExchangeRedis?将简单的 SET 与 StackExchangeRedis 一起使用?
【发布时间】:2021-07-05 06:48:08
【问题描述】:

我正在使用带有StackExchangeRedis 的.Net 核心:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddStackExchangeRedisCache(options =>
           {
               options.Configuration = "127.0.0.1:6379";
           });
        services.AddControllers();

    }

稍后我注入服务并通过 set/get 对其进行测试:

private readonly IDistributedCache _cache;

        public MyRedisController(IDistributedCache cache)
        {
            _cache = cache;
        }

        [HttpGet]
        public async Task<string> Get()
        { 
             _cache.SetString("dd", "5");
            var a = await _cache.GetStringAsync("dd"); //5
            return a;


        }

问题是当我尝试获取redis-cli 中的值时,我看到了:

127.0.0.1:6379> get "dd"
(error) WRONGTYPE Operation against a key holding the wrong kind of value

经过调查,我看到它存储为哈希:

问题:

如何使用 StackExchangeRedis 来存储 simple 没有哈希类型的字符串类型?我想要一个简单的字符串。 (获取/设置)

ps
我知道我可以通过:hget "dd" data 获得价值。但我在存储简单的字符串类型之后。

【问题讨论】:

    标签: c# .net-core redis stackexchange.redis


    【解决方案1】:

    要明确一点:问题中显示的代码都没有(直接)接触 StackExchange.Redis; AddStackExchangeRedisCache 是 Microsoft 的 ASP.NET 层包装器,并且不是 StackExchange.Redis 的一部分 - 它看起来像它做其他事情来封装额外的功能,如绝对/滑动到期,但坦率地说(作为观察):

    1. 如果-1 表示“未设置”,他们可能只是没有存储哈希字段
    2. 通过EXPIRE直接在redis中支持绝对过期

    我很高兴添加一个答案,但它在 StackExchange.Redis 方面:

    // note: the multiplexer is disposable, but you usually keep this around
    //  and reuse it between lots of operations - don't Connect each time
    var muxer = ConnectionMultiplexer.Connect("127.0.0.1:6379");
    
    // actually do things
    var db = muxer.GetDatabase();
    db.StringSet("dd", 5);
    var value = db.StringGet("dd");
    Console.WriteLine((int)value);
    

    如果您想查看AddStackExchangeRedisCache 在幕后所做的事情,您可以使用redis-cli MONITOR 查看它在您的原始代码中发出了哪些命令。

    【讨论】:

    • Marc,MS 为何将他们的包称为 AddStackExchangeRedisCache (而不使用 Stackexchange.REdis)?不是来自 Stackoverflow 的 stackexchange 吗?
    • @Royi 它在 internally 中使用它,作为他们的代码和 redis 服务器之间的层,但是:MS API 并不声称是 1:1 映射到redis API(这是 SE-Redis 的工作)。所以:当你在 MS API 上说“存储这个字符串”时,它并不意味着“在 redis 中使用字符串概念”,它只是意味着“存储它 - 如何由你决定”,在这种情况下,MS API 选择使用 redis 哈希。有道理?是的,StackExchange.Redis 由(并为)Stack Exchange / Stack Overflow 维护
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 2014-11-29
    • 1970-01-01
    • 2013-11-01
    相关资源
    最近更新 更多