【问题标题】:Operation against a key holding the wrong kind of value in redis when pushing data on a list将数据推送到列表时,对在 redis 中持有错误类型值的键进行操作
【发布时间】:2015-11-27 21:53:39
【问题描述】:

创建了 redis 列表和设置键,就像下面让我出错

      public async Task MyMethod<T>()
                {
//if i'm doing following it is working
  string listname = "listname";
                    string listkey = "key";
                    RedisList<string> demodemo = new RedisList<string>(Settings, listname);
                    await demodemo.LeftPush(listkey);

//but i want to do it like below it is thoughing exception
            RedisList<string> list = new RedisList<string>(Settings, typeof(T).Name.ToString());
    string mykey = "myId";
    await list.LeftPush(mykey);

出现以下错误:

结果消息:StackExchange.Redis.RedisServerException:ERR 对持有错误值的键进行操作

【问题讨论】:

    标签: c# azure caching redis stackexchange.redis


    【解决方案1】:

    作为旁注; RedisList&lt;T&gt; 不是 SE.Redis 类型,所以我不能直接评论。但是:当您尝试做没有意义的事情时,该错误消息来自 redis-server 本身;例如,如果foo 是一个字符串,你不能lpop foozcard foo

    所以问题变成了:存储的值是多少?我不能为你回答这个问题,但是:服务器可以。如果您熟悉 redis-cli,那么 debug object fooobject encoding foo 可能会有用。虽然老实说,您可能会通过猜测来做同样的事情:

    • strlen foo - 如果可行,它是一个字符串
    • hlen foo - 如果可行,它就是一个哈希
    • llen foo - 如果可行,它就是一个列表
    • scard foo - 如果这行得通,它就是一个集合
    • zcard foo - 如果可行,它就是一个排序集

    请注意,所有这些命令都可以通过 SE.Redis 使用,但对于调查可疑数据库,redis-cli 通常更容易。

    可能发生的情况是您在没有意识到的情况下不小心重用了一个键名。这可能是为您的键名添加前缀的价值的一个很好的广告 - SE.Redis 在与数据库对话时可以自动为您做的其他事情。

    【讨论】:

    • 我正在使用 SE.Redis,但使用它彻底 https://github.com/neuecc/CloudStructures typeof(T).Name.ToString() 只不过是类名,如 Customer 但我想知道为什么我不能使用它?请指导..正如你所说,foo是我的typeof(T).Name.ToString()这个?
    • @Neo 你绝对可以使用typeof(T).Name.ToString() 是多余的);那不是问题。问题是你的数据库中已经有其他东西被称为Customer。那么:目前Customer 是什么,为什么您要为不同的目的两次使用相同的密钥?注意:typeof(T).FullName"/arbitrary-prefix/" + typeof(T).Name 的冲突可能更少
    猜你喜欢
    • 2011-06-02
    • 2021-05-25
    • 2016-10-24
    • 1970-01-01
    • 2018-06-01
    • 2020-10-01
    • 2021-04-10
    • 2016-05-04
    • 2019-11-08
    相关资源
    最近更新 更多