当散列键为GUID时,StackExchange.Redis HGET / HGETASYNC返回null

时间:2015-02-23 10:14:38

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

我遇到了一些问题,我相信它可能是 StackExchange.Redis 库中的错误。

当我创建密钥为GUID的哈希时,.HashGetHashGetAsync都会返回null值,而当我尝试使用{{1}获取相同的哈希密钥时我能够成功检索哈希值。

1 个答案:

答案 0 :(得分:1)

从你的评论中,这里的guid似乎是哈希字段子键。从根本上说,它运作良好;见:

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);
    }
}

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

我只能假设这是一种期望的失败;例如:

  • 你在一个地方使用字符串而在另一个地方使用二进制(它们不相等)
  • 您在两个地方使用不同的格式(案例,间距,连字符等)规则(它们不相等)
  • 你正在犯下疯狂的结局&#34; Guid.ToByteArray()输出人们通常期望的内容。

你可以在这里看到最后一个场景:

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()!但是,我强烈怀疑前两个更有可能。要进行调查,最好的办法是在redis-cli模式下运行monitor,同时比较两个不同系统正在做的事情。