Redis中的Lua脚本:使用表格的HMGET?

存在将一个表传递给单个 redis.call('HMGET', [key], ...) 的类似行为吗?而不是循环遍历表并依次运行多个 redis.call


我在Redis中有一个哈希键,用于表示具有100000个条目的树状数组。它具有顺序的整数索引和浮点值:

127.0.0.1:6379[1]> hmget fenwick 1 2 3 4 ...
1) "0.75865226460558"
2) "1.0234678955857959"
3) "0.057608450324092272"
4) "1.1002286486794375"
...

我正在尝试使用Redis的内置Lua解释器找到一些随机条目 entryid 的总和。显然,这样做的天真方法是一次对表执行单个访问,如下所示:

local sum=0
while entryid>0 do
    sum=sum+redis.pcall('HGET',KEYS[1],temp)
    entryid=entryid-bit.band(entryid,-entryid)
end

我尝试生成并加载一个字符串,将所有命令压缩为一个 HMGET 并减少往返次数:

local evalstr="return redis.pcall('HMGET',KEYS[1]"
local sum=0
while entryid>0 do
    evalstr=evalstr..','..temp
    entryid=entryid-bit.band(temp,-temp)
end
local vals=loadstring(evalstr..')')()
for i=1,#vals do
    sum=sum+vals[i]
end

但是,无论 fenwick 的大小如何,编译的开销都使此查询比第一个查询慢。

基本上,我正在寻找这种行为:

local tbl={}
local c=1
while temp>0 do
    tbl[c]=temp
    c=c+1
    temp=temp-bit.band(temp,-temp)
end
local vals=redis.pcall('HMGET',KEYS[1],tbl)
local sum=0
for i=1,#vals do
    sum=sum+vals[i]
end

但是显然它不起作用。是否有某种方法首先在Lua中收集要查询到Redis的所有值,然后将它们作为单个命令发送到Redis?

点赞
用户3160475
用户3160475

你可以使用内置的unpack函数将Lua表转换为可变函数的一系列参数。

在你的Lua脚本中,执行以下操作:

redis.pcall('HMGET',KEYS[1],unpack(tbl))
2015-04-13 13:40:04