[qishibo/AnotherRedisDesktopManager]msgpack int64 反序列化错误

2025-10-27 249 views
4
OS

Windows

VERSION

1.5.6

ISSUE DESCRIPTION

int64 反序列化出来的结果是错的,像是溢出了。

测试数据

输入:

{
  "int64test": 420764525925502976,
}

输出:

{
  "int64test": 420764525925503000,
}

回答

2

又试了一下,应该是浮点数精度不够,使用 redis lua 内置的 cjson 和 cmsgpack 反序列化时,得到的结果变成浮点数了:

127.0.0.1:6379> eval "return cjson.encode(cmsgpack.unpack(redis.call('hget','player:420764525925502976','_v1')))" 0
"{\"PlayerId\":4.207645259255e+17,\"MapID\":0,\"Exp\":0,\"HeroId\":310,\"UserId\":4.2076432704838e+17}"

而实际上:

  • PlayerId = 420764525925502976
  • UserId = 420764327048384512
0

image 试了一下,msgpack解析只会转为string展示,不会转换类型还

4

会不会是cjson.encode int转换问题

7

知道怎么重现了,用下面的两条命令,分别在终端和 AnotherRedisDesktopManager 终端里执行,就可以稳定重现:

EVAL "return cmsgpack.pack({'foo', 'bar', 420764525925502976})" 0
EVAL  "return cmsgpack.unpack(ARGV[1])" 0 "\x93\xa3foo\xa3bar\xcf\x05\xd6\xdb\x1be\xe0\x10\x00"

终端返回的结果是正确的,ARDM 里返回的不对

终端执行结果:

127.0.0.1:6379> EVAL "return cmsgpack.pack({'foo', 'bar', 420764525925502976})" 0
"\x93\xa3foo\xa3bar\xcf\x05\xd6\xdb\x1be\xe0\x10\x00"
127.0.0.1:6379> eval "return cmsgpack.unpack(ARGV[1])" 0 "\x93\xa3foo\xa3bar\xcf\x05\xd6\xdb\x1be\xe0\x10\x00"
1) "foo"
2) "bar"
3) (integer) 420764525925502976

ARDM 执行结果:

> EVAL "return cmsgpack.pack({'foo', 'bar', 420764525925502976})" 0
\x93\xa3foo\xa3bar\xcf\x05\xd6\xdb\x1be\xe0\x10\x00
> eval "return cmsgpack.unpack(ARGV[1])" 0 "\x93\xa3foo\xa3bar\xcf\x05\xd6\xdb\x1be\xe0\x10\x00"
foo
bar
420764525925503000
8

哦哦,Another的cli结果有问题,已修复