我希望通过' 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不起作用。!!!
如何汇总密钥???的值?
答案 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
每个人都有美好的一天~~ !!