2014-02-11 30 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