【问题标题】:StackExchange.Redis HGET/HGETASYNC returns null when hash key is GUID当哈希键为 GUID 时,StackExchange.Redis HGET/HGETASYNC 返回 null
【发布时间】:2015-04-24 15:11:38
【问题描述】:

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

当我创建键为 GUID 的哈希时,.HashGetHashGetAsync 都将返回 null 值,而当我尝试使用 redis-cli 获取相同的哈希键时,我能够检索哈希值成功。

【问题讨论】:

  • 您有确切的代码示例吗?没有从GuidRedisKey 的隐式转换,所以我很好奇这是通过string 还是byte[],无论哪种方式:你是如何做到的。我还想知道您是否可以在单独的 redis-cli 实例上运行 MONITOR 以查看这两种方法正在发布什么。
  • @MarcGravell 这是字符串。我将直接尝试RedisKey,看看会发生什么
  • 我的第一个猜测是:格式化;大写、间距、连字符等
  • @MarcGravell Uhm 使用 Guid.ToString 或 Guid.ToByteArray 会导致 null。代码是这样的:db.HashGetAsync(string.Format("whatever:licensing:products:{0}:features:{1}:all", productId, featureId), id.ToByteArray())
  • @MarcGravell 实际上我正在将string.format 的结果“快速观看”的关键复制粘贴到redis-cli,这样我就可以获得哈希值

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


【解决方案1】:

从您的 cmets 来看,这里的 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);
    }
}

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

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

  • 您在一个地方使用字符串,而在另一个地方使用二进制(它们不会相等)
  • 您在两个地方使用了不同的格式(大小写、间距、连字符等)规则(它们不会相等)
  • 您违反了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

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

【讨论】:

  • 我会把所有东西放在一起,看看你的建议是否能解决问题!!提前感谢您的努力
  • 嘿!我到处都在做Guid.ToString()。顺便说一句,我相信实际上这个问题更多地与 RedisKey 而不是某些哈希中的子键有关。我试图做monitor 的事情,它输出了正确的命令。毕竟,如果我将命令复制粘贴到redis-cli 并执行它,我可以检索数据!!!图书馆本身似乎发生了一些奇怪的事情,我错了吗?
  • OMFG!!!!!!!!!!!!你知道#@3 是什么吗!!!问题??在具体方法中,我没有选择正确的 Redis DB!当我运行测试时,我选择db 1 而不是0,创建密钥的方法正确指向1,而检索它们的方法指向0!!!!!!!!!啊……嗯,谢谢你的努力……
  • @MatíasFidemraizer 哈哈!很公平 - 我没有立即想到“错误的 DB”,但显示了可重复样本的重要性;p
猜你喜欢
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2023-03-17
  • 2011-05-19
  • 1970-01-01
相关资源
最近更新 更多