3
是否存在任何類似的行爲將表傳遞給單個redis.call('HMGET',[key],...)
,而不是循環遍歷表並且一個接一個地運行多個redis.call
?Redis中的Lua腳本:HMGET與表?
我在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"
...
我試圖找到總和內置的Lua解釋一些隨機進入entryid
使用Redis的。顯然,這樣做的簡單的方式是在這樣的時刻執行對錶一個單一訪問:
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?
看看Lua的解壓 - IIRC它你以後 –
@ItamarHaber是啊什麼,這不正是我一直在尋找! 'redis.pcall('HMGET',KEYS [1],unpack(tbl))'完美地工作。 – concat
很酷 - 我會將此評論寫入移動設備中作爲答案。 –