我与Redis的LUA工作,需要在现场进行了逐位逻辑运算以53位(Redis的整数部分的默认长度有序集分)Redis的LUA位溢出
但似乎我”取m运气:
127.0.0.1:6379> eval 'return bit.lshift(1, 30) ' 0
(integer) 1073741824
127.0.0.1:6379> eval 'return bit.lshift(1, 31) ' 0
(integer) -2147483648
这似乎有点*只能在30位进行操作,然后溢出(32位有符号整数)
我使用Linux 64位,Redis的编译为64位。以及。 它看起来像位库的限制:
http://bitop.luajit.org/api.html
注意,所有的位操作,返回签名的32位数字(原理)。 默认情况下这些打印为带符号的十进制数字。
在另一方面...
eval 'return math.pow(2, 53) ' 0
(integer) 9007199254740992
任何想法如何更好地解决这个问题?
P.S.有人会说这个逻辑移动到客户端 - 但我不能。这件作品是相当复杂的,需要紧密合作,以数据
好吧,我发现这一个:HTTP://计算器。 com/a/7333595/1812225 纯粹可怕和缓慢,但看起来像redis离开我没有选择:( – let4be
对于那些有兴趣的添加链接到redis问题:https://github.com/antirez/redis/issues/2843 – let4be