【问题标题】:Read first bytes of lrange results using Lua scripting使用 Lua 脚本读取 lrange 结果的第一个字节
【发布时间】:2016-05-29 20:18:15
【问题描述】:

我想从 redis 的列表中读取和过滤数据。我想检查 blob 中数据的前 4 个字节(一个 int32),以与我将作为 ARG 传入的 int32 进行比较。

我启动了一个脚本,但是如何检查前 4 个字节?

local updates = redis.call('LRANGE', KEYS[1], 0, -1)

local ret = {}
for i=1,#updates do
    -- read int32 header
    -- if header > ARGV[1] 
    ret[#ret+1] = updates[i]
end
return ret

另外,我看到有一组有限的库:http://redis.io/commands/EVAL#available-libraries

编辑:还有一些问题,由于 LUA 存储数字的方式,我遇到了问题 - ARGV[1] 是一个 8 字节字符串,不能安全地转换为 64 位数字。我认为这是由于 LUA 将所有内容都存储为双精度,只有 52 位精度。

编辑:我接受下面的答案,但将问题更改为 int32。问题的int64部分我放到另一个问题中:Comparing signed 64 bit number using 32 bit bitwise operations in Lua

【问题讨论】:

    标签: lua redis


    【解决方案1】:

    Redis Lua 解释器加载struct 库,所以试试

    if struct.unpack("I8",updates) > ARGV[1] then
    

    【讨论】:

    • 这似乎只在数字小于 52 位时才有效。
    • 我把问题改成了 int32s。此解决方案在抽象为 LUA 号码处理的 8 字节 b/c 时不起作用。如果您想使用 64 位,请参阅 stackoverflow.com/questions/35488855/…
    • @Charles,它应该可以在 Lua 5.3 中使用,但我不知道使用哪个版本的 Lua Redis。
    • Redis 使用 Lua 5.1,貌似不支持 int64s。我也通过输入 int64 数字对此进行了测试,但我丢失了 LSB 值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    相关资源
    最近更新 更多