2
votes

I'm want to read and filter data from a list in redis. I want to inspect the first 4 bytes (an int32) of data in a blob to compare to an int32 I will pass in as an ARG.

I have a script started, but how can I check the first 4 bytes?

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

Also, I see there is a limited set of libraries: http://redis.io/commands/EVAL#available-libraries

EDIT: Some more poking around and I'm running into issues due to how LUA stores numbers - ARGV[1] is a 8 byte string, and cannot be safely be converted into a 64 bit number. I think this is due to LUA storing everything as doubles, which only have 52 bits of precision.

EDIT: I'm accepting the answer below, but changing the question to int32. The int64 part of the problem I put into another question: Comparing signed 64 bit number using 32 bit bitwise operations in Lua

1

1 Answers

2
votes

The Redis Lua interpreter loads struct library, so try

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