【发布时间】:2015-11-02 09:44:33
【问题描述】:
我正在使用 redis lua,需要对最多 53 位的字段执行按位逻辑运算(redis 有序集分数的整数部分的默认长度)
但看来我倒霉了:
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
好像bit.*只能操作30位然后溢出(32位有符号整数)
我使用的是 64 位的 Linux,redis 也被编译为 64 位。 看起来像是位库的限制:
http://bitop.luajit.org/api.html
请注意,所有位运算都返回有符号的 32 位数字(基本原理)。 这些默认情况下打印为带符号的十进制数字。
另一方面...
eval 'return math.pow(2, 53) ' 0
(integer) 9007199254740992
知道如何更好地克服这个问题吗?
附:有人会说将此逻辑移至客户端-但我不能。这件作品相当复杂,需要与数据密切合作
【问题讨论】:
-
好的,我找到了这个:stackoverflow.com/a/7333595/1812225 非常糟糕而且很慢,但看起来 redis 让我别无选择:(
-
对于那些有兴趣添加redis问题链接的人:github.com/antirez/redis/issues/2843