2014-02-11 67 views
11

我正在構建我的第一個Redis服務器端腳本(,用於調試),而且我缺乏Lua經驗讓我非常困惑。Redis的Lua腳本總結了密鑰的值

基本上有一個K/V對(包含〜1000個值)的數據集,我想從中列出所有匹配模式的KEYS。例如在redis-cli中:

> KEYS "carlos:*" 
1) "carlos:1" 
2) "carlos:2" 
3) "carlos:3" 
4) "carlos:4" 

基於上面的輸出,我想通過執行一個Lua腳本返回這些鍵的總和。 〜#Redis的-CLI EVAL「$:目前我已經在我的sum.lua

local sum = 0 
local matches = redis.call('KEYS', 'carlos:*') 

for unpack(matches) 
    sum = sum + redis.call('GET', matches) 
end 

return sum 

雖然上面的腳本可能不正確,甚至redis.call('KEYS', 'carlos:*')通過自身努力產生以下錯誤

根@卡洛斯以下(貓sum.lua)」

(錯誤)錯誤的 'EVAL' 命令

I H錯誤的參數個數ave嘗試了一些我的語法迭代無濟於事。有任何想法嗎?

由於

回答

19
  1. EVAL最少需要兩個參數;腳本和您傳遞給腳本的鍵的數量。在這種情況下,你是路過零個鍵,這意味着腳本可以調用如下:

    redis-cli EVAL "$(cat sum.lua)" 0 
    

    或:

    redis-cli --eval sum.lua 
    
  2. 您的遍歷從KEYS返回是不正確的值環結構;我已經爲你修好了。

  3. 您需要使用Lua的tonumber函數將從GET返回的值從字符串轉換爲數字。

上將上述變化,下面的腳本應該爲你工作:

local sum = 0 
local matches = redis.call('KEYS', 'carlos:*') 

for _,key in ipairs(matches) do 
    local val = redis.call('GET', key) 
    sum = sum + tonumber(val) 
end 

return sum 
+0

注意,這將永遠緩存腳本在Redis的,所以你應該正常使用ARGV來傳遞參數,而不是硬編碼像'carlos:*'這樣的參數。 – CherryDT