首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在带有lua脚本的redis中使用'hget‘命令获取key的值

如何在带有lua脚本的redis中使用'hget‘命令获取key的值
EN

Stack Overflow用户
提问于 2018-01-25 18:25:04
回答 3查看 1.5K关注 0票数 2

我想用'hget‘命令汇总每月的键值。

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

我想总结一下键值为2018.01,所以我做到了..

sumkey.lua

代码语言:javascript
运行
复制
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:脚本试图访问不存在的全局变量'dd‘

tostring不起作用。!

如何汇总key的值?

EN

回答 3

Stack Overflow用户

发布于 2018-01-25 18:30:12

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

票数 3
EN

Stack Overflow用户

发布于 2018-01-26 01:12:37

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

代码语言:javascript
运行
复制
local dd
if i < 10 then dd = '0' .. tostring(i)
else dd = tostring(i)
end

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

代码语言:javascript
运行
复制
local dd = i < 10 and '0' .. tostring(i) or tostring(i)

或者使用format

代码语言:javascript
运行
复制
forkey = mon .. ("%02d"):format(i)
票数 0
EN

Stack Overflow用户

发布于 2018-01-26 09:28:08

我做到了。

见下文。

:sumkey.lua

代码语言:javascript
运行
复制
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站点57 :TotalCnt,'201801‘(整数)57

祝大家今天过得愉快~~!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48440596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档