2015-04-12 167 views
3

是否存在任何類似的行爲將表傳遞給單個redis.call('HMGET',[key],...),而不是循環遍歷表並且一個接一個地運行多個redis.callRedis中的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?

+5

看看Lua的解壓 - IIRC它你以後 –

+0

@ItamarHaber是啊什麼,這不正是我一直在尋找! 'redis.pcall('HMGET',KEYS [1],unpack(tbl))'完美地工作。 – concat

+0

很酷 - 我會將此評論寫入移動設備中作爲答案。 –

回答

3

你可以用一個內置的unpack函數將一個Lua表變成一系列參數給一個可變參數函數。

在你的情況,你將在你的Lua腳本如下:

redis.pcall('HMGET',KEYS[1],unpack(tbl))