Redis的Lua脚本,它总结了键的值

Car*_*los 13 database scripting lua compiler-errors redis

我正在构建我的第一个Redis服务器端脚本(用于调试),而我缺乏Lua经验让我非常困难.

基本上有一个K/V对的数据集(包含〜1000个值),我想从中列出所有匹配模式的KEYS.例如在redis-cli中:

> KEYS "carlos:*"
1) "carlos:1"
2) "carlos:2"
3) "carlos:3"
4) "carlos:4"
Run Code Online (Sandbox Code Playgroud)

根据上面的输出,我想通过执行Lua脚本返回这些键的总和.目前,我有以下内容sum.lua

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

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

return sum
Run Code Online (Sandbox Code Playgroud)

虽然上述脚本可能不正确,但即使单独尝试也会redis.call('KEYS', 'carlos:*')产生以下错误

root @ carlos:〜#redis-cli EVAL"$(cat sum.lua)"

(错误)ERR'eval'命令的参数个数错误

我尝试过多次迭代我的语法无济于事.有任何想法吗?

谢谢

Tim*_*per 21

  1. EVAL至少需要两个参数; 脚本和传递给脚本的键数.在这种情况下,您传递的是零键,这意味着可以按如下方式调用脚本:

    redis-cli EVAL "$(cat sum.lua)" 0
    
    Run Code Online (Sandbox Code Playgroud)

    要么:

    redis-cli --eval sum.lua
    
    Run Code Online (Sandbox Code Playgroud)
  2. 用于迭代返回值的循环结构KEYS不正确; 我已经为你修好了.

  3. 您需要GET使用Lua tonumber函数将字符串返回的值转换为数字.

完成上述更改后,以下脚本应该适用于您:

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
Run Code Online (Sandbox Code Playgroud)