StackExchange.Redis HGET/HGETASYNC returns 当哈希键为 GUID 时为 null

StackExchange.Redis HGET/HGETASYNC returns null when hash key is GUID

我遇到了一些问题,我认为这可能是 StackExchange.Redis 库中的错误。

当我创建一个键为 GUID 的散列时,.HashGetHashGetAsync 都会 return 一个 null 值,而当我尝试获取相同的散列时使用 redis-cli 的密钥我能够成功检索哈希值。

从你的评论来看,这里的guid好像是hash字段子键。从根本上说,它工作正常;见:

static void Main()
{
    int i = new Random().Next();
    Console.WriteLine("> {0}", i);
    Guid guid = Guid.NewGuid();
    using (var muxer = ConnectionMultiplexer.Connect("127.0.0.1:6379"))
    {

        var db = muxer.GetDatabase();
        db.KeyDelete("foo");
        db.HashSet("foo", guid.ToByteArray(), i);
    }
    using (var muxer = ConnectionMultiplexer.Connect("127.0.0.1:6379"))
    {
        var db = muxer.GetDatabase();
        var val = (int)db.HashGet("foo", guid.ToByteArray());
        Console.WriteLine("< {0}", val);
    }
}

它应该显示相同的随机生成的数字两次(设置一次,获取一次)。

我只能假设这是一个预期失败;例如:

  • 你在一个地方使用字符串而在另一个地方使用二进制(它们不相等)
  • 您在这两个地方使用了不同的格式(大小写、间距、连字符等)规则(它们不会相等)
  • 您违反了 Guid.ToByteArray() 的 "crazy endianness",它不会 输出人们通常期望的结果。

您可以在此处查看最后一个场景:

Guid guid = new Guid("00112233-4455-6677-8899-AABBCCDDEEFF");
var arr = guid.ToByteArray();
for(int i = 0 ; i < arr.Length; i++)
{
    if (i == 4 || i == 6 || i == 8 || i == 10) Console.Write('-');
    Console.Write(arr[i].ToString("X2"));
}
Console.WriteLine();

实际输出:

33221100-5544-7766-8899-AABBCCDDEEFF

注意第一、二、三组是反的。如果这个是问题,那就怪ToByteArray()!但是,我强烈怀疑前两个更有可能。要进行调查,最好的办法是在 monitor 模式下 运行 redis-cli,同时比较两个不同的系统正在做什么。