【问题标题】:How can I get values of key with 'hget' command in redis with lua script如何使用 lua 脚本在 redis 中使用“hget”命令获取键的值
【发布时间】:2018-07-04 13:37:27
【问题描述】:

我想用 '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试图访问不存在的全局变量'dd'

tostring 不起作用。!!!

如何汇总键的值???

【问题讨论】:

    标签: lua redis


    【解决方案1】:

    尝试在循环之前声明它(dd)。 问题是如果if语句不满足,则dd变量没有定义,所以它会试图找到一个这个名字的全局变量。

    【讨论】:

    • else 之后添加local 是行不通的,因为它将使值仅本地化到else 块。
    • @PaulKulchenko 没错,我的错!我已经编辑了答案,所以它可以被批准。 :)
    【解决方案2】:

    您必须在 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)
    

    【讨论】:

      【解决方案3】:

      我做到了。

      见下文。

      :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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-07
        • 2019-02-17
        • 1970-01-01
        • 2014-03-09
        • 1970-01-01
        • 2012-05-14
        • 1970-01-01
        相关资源
        最近更新 更多