如何使用 Lua 脚本在 Redis 中使用 'hget' 命令获取键的值

我想使用 '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 (error) ERR Error running script (call to f_1c9d9d311f9c1e2fbb34fa81176539ad45da3b5b): @enable_strict_lua:15: user_script:8: Script attempted to access unexisting global variable 'dd'

tostring 不起作用!!!

我该如何总结键的值???

点赞
用户5893652
用户5893652

尝试在循环之前声明 dd 变量。 问题在于如果 if 语句没有被满足,dd 变量将没有被定义,因此它会尝试查找名为 dd 的全局变量。

2018-01-25 10:30:11
用户1442917
用户1442917

你必须在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)
2018-01-25 17:12:36
用户6855994
用户6855994

: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' (integer) 57

大家有美好的一天~~!!

2018-01-26 01:28:08