Lua Redis 中的脚本:使用 table 的 HMGET?
Lua script in Redis: HMGET with table?
是否存在将 table 传递给单个 redis.call('HMGET',[key],...)
的任何类似行为,而不是遍历 table 和 运行 多个 redis.call
,一个接着一个?
我在 Redis 中有一个散列键,它表示具有 100000 个条目的 Fenwick 树。它具有顺序整数索引和浮点值:
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
的总和。显然,这样做的天真方法是像这样一次对 table 执行单个访问:
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?
您可以使用内置 unpack
函数将 Lua table 转换为可变参数函数的一系列参数。
对于您的情况,请在 Lua 脚本中执行以下操作:
redis.pcall('HMGET',KEYS[1],unpack(tbl))
是否存在将 table 传递给单个 redis.call('HMGET',[key],...)
的任何类似行为,而不是遍历 table 和 运行 多个 redis.call
,一个接着一个?
我在 Redis 中有一个散列键,它表示具有 100000 个条目的 Fenwick 树。它具有顺序整数索引和浮点值:
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
的总和。显然,这样做的天真方法是像这样一次对 table 执行单个访问:
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?
您可以使用内置 unpack
函数将 Lua table 转换为可变参数函数的一系列参数。
对于您的情况,请在 Lua 脚本中执行以下操作:
redis.pcall('HMGET',KEYS[1],unpack(tbl))