在向列表中添加数据时,针对持有错误类型值的键进行的redis操作

5
创建 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对保存了错误类型值的键执行操作。
1个回答

8
作为一个附注,RedisList<T>不是SE.Redis类型,所以我无法直接评论。但是:当你尝试执行不合理操作时,例如如果 foo 是字符串,则该错误消息来自redis-server本身,您不能 lpop foo zcard foo

因此,问题变成了:存储的值是什么? 我无法为您回答,但服务器可以。如果您熟悉redis-cli,那么 debug object foo object 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
1
@Neo,你完全可以使用typeof(T).Name.ToString()是多余的);这不是问题所在。问题在于你的数据库中已经有了另一个名为“Customer”的东西。那么:当前的“Customer”是什么,为什么要尝试为不同的目的使用相同的键?注意:typeof(T).FullName可能会有更少的冲突,"/arbitrary-prefix/" + typeof(T).Name也可能会有更少的冲突。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接