3

非常烦人的崩溃StackExchange.Redis SetAdd(key, val)

我想设置一个以程序 GUID 作为键的集合。

我发现(经过 3 小时的调试)SetAdd(key, val)可以使用某些 GUID,但会与其他 GUID 一起崩溃:

        string key = "02639d71-0935-35e8-9d1b-9dd1a2a34629";
        const string val = "somevalue";

        db.SetAdd(key, val); // <=== Works

        key = "02639d71-0935-35e8-9d1b-9dd1a2a34627";
        db.SetAdd(key, val); // <=== CRASH @@!!@!@!

区别在于最后一个字符“9”与“7”

不能SetAdd将本地 GUID 用作密钥?

环境:C# .NET 4 Win 8.1 VS2013

崩溃消息:

An unhandled exception of type 'StackExchange.Redis.RedisServerException' occurred in StackExchange.Redis.dll
Additional information: WRONGTYPE Operation against a key holding the wrong kind of value

坠机点在StackExchange.Redis

在此处输入图像描述

...

我在 LINQPad 中测试了这段代码。它在同一个地方崩溃。第一个 GUID 有效,第二个无效。

似乎崩溃不是因为这是启动应用程序 GUID。

使用不同的 GUID 进行更多测试。只有以“7”结尾的崩溃。

    key = "02639d71-0935-35e8-9d1b-9dd1a2a34622";
    key = "02639d71-0935-35e8-9d1b-9dd1a2a34623";
    key = "02639d71-0935-35e8-9d1b-9dd1a2a34624";
    key = "02639d71-0935-35e8-9d1b-9dd1a2a34625";
    key = "02639d71-0935-35e8-9d1b-9dd1a2a34626";
    key = "02639d71-0935-35e8-9d1b-9dd1a2a34627"; // <= crashes
    key = "02639d71-0935-35e8-9d1b-9dd1a2a34628";
    key = "02639d71-0935-35e8-9d1b-9dd1a2a34629";

...

KeyExists, StringIncrement,StringSet与 key = my GUID 配合使用效果很好。

4

1 回答 1

5

Redis 键是不透明的。那条信息:

WRONGTYPE 对持有错误值的键的操作

仅仅意味着您之前已将数据存储在非“集合”类型的键中。尝试(在 redis-cli 中):

TYPE "02639d71-0935-35e8-9d1b-9dd1a2a34627"

这将告诉您现有数据的数据类型。SADD只有当键不存在,或者它存在并且是一个 set时,您才能使用。

于 2014-06-09T16:44:53.213 回答