Lua script для Redis, который суммирует значения ключей

Я создаю свою первую серверную серверную часть Redis script (для отладки), и мой недостаток опыта Lua заставил меня застрять.

По существу, есть набор данных из пар K/V (содержащий ~ 1000 значений), из которых я хочу перечислить все KEYS, которые соответствуют шаблону. Например, в redis-cli:

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

Основываясь на вышеприведенном выходе, я хочу вернуть сумму этих ключей, выполнив Lua script. В настоящее время у меня есть следующие на sum.lua

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

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

return sum

В то время как приведенный выше script, вероятно, неверен, попытка даже выполнить redis.call('KEYS', 'carlos:*') сама по себе вызывает следующую ошибку:

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

(ошибка) ERR неверное количество аргументов для команды "eval"

Я пробовал несколько итераций моего синтаксиса безрезультатно. Любые идеи?

Спасибо

Ответ 1

  • EVAL требует минимум двух аргументов; script и количество ключей, которые вы передаете в script. В этом случае вы передаете нулевые ключи, что означает, что script можно вызвать следующим образом:

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

    или

    redis-cli --eval sum.lua
    
  • Ваша структура цикла для итерации над значениями, возвращаемыми из KEYS, была неправильной; Я исправил это для вас.

  • Вам нужно преобразовать значение, возвращаемое из GET из строки в число, используя функцию Lua tonumber.

При сделанных выше изменениях для вас должно работать следующее script:

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