如何通过' hget'来获取密钥的值?使用lua脚本在redis中命令

时间:2018-01-25 10:25:04

标签: lua redis

我希望通过' hget'来汇总每月的关键值。命令。

测试集)     hmset SiteID:TotalCnt 20180101 10 20180102 2 20180103 5 20180120 10 20180131 30 20180205 20 20180210 5

我想汇总2018.01的关键值 所以,我做了..

sumkey.lua

local mon = ARGV[1]
local sumkey = 0
local forkey = ''
for i = 1,31 do
    if i < 10 then local dd = '0' .. tostring(i)
    else dd = tostring(i)
    end 
    forkey = mon .. dd
    sumkey = sumkey + redis.call('hget' , KEYS[1] , forkey)
 end
 return sumkey

ubuntu @:〜$ redis-cli -n 2 --eval sumkey.lua (错误)ERR错误运行脚本(调用f_1c9d9d311f9c1e2fbb34fa81176539ad45da3b5b):@ enable_strict_lua:15:user_script:8:脚本试图访问未存在的全局变量&#39; dd&#39;

tostring不起作用。!!!

如何汇总密钥???的值?

3 个答案:

答案 0 :(得分:3)

尝试在循环之前声明它(dd)。 问题是如果不满足if语句,则未定义dd变量,因此它尝试查找具有此名称的全局变量。

答案 1 :(得分:0)

你必须在if ... then分支之前“本地化”变量,否则它只会在该分支内保持“可见”,并且在离开分支之后,该值将恢复为之前的任何值:

local dd
if i < 10 then dd = '0' .. tostring(i)
else dd = tostring(i)
end

您也可以将其转换为一个表达式:

local dd = i < 10 and '0' .. tostring(i) or tostring(i)

或使用format

forkey = mon .. ("%02d"):format(i)

答案 2 :(得分:0)

我做到了。

见下文。

:sumkey.lua

local key, mon = KEYS[1], ARGV[1]
local subkey
local sumkey, keyval= 0

for i = 1,31 do
    if i < 10 then subkey = mon .. '0' .. tostring(i)
    else subkey = mon .. tostring(i)
    end

    keyval = tonumber(redis.call('hget',KEYS[1],subkey))

    if keyval ~= nil then
        sumkey = sumkey + keyval
    end
end

return sumkey

ubuntu @ $ redis-cli -n 2 --eval sumkey.lua SiteID:TotalCnt,'201801' (整数)57

每个人都有美好的一天~~ !!