StackExchange.Redis HGET/HGETASYNC returns 当哈希键为 GUID 时为 null
StackExchange.Redis HGET/HGETASYNC returns null when hash key is GUID
我遇到了一些问题,我认为这可能是 StackExchange.Redis 库中的错误。
当我创建一个键为 GUID 的散列时,.HashGet
或 HashGetAsync
都会 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
,同时比较两个不同的系统正在做什么。
我遇到了一些问题,我认为这可能是 StackExchange.Redis 库中的错误。
当我创建一个键为 GUID 的散列时,.HashGet
或 HashGetAsync
都会 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
,同时比较两个不同的系统正在做什么。