【问题标题】:redis: "Multi Bulk Reply" -> lua tableredis:“多批量回复”-> lua 表
【发布时间】:2012-08-29 23:33:02
【问题描述】:

我有一个这样的排序集:

    |key  |score |member
zadd mykey 100    event:1
zadd mykey 101    event:2
zadd mykey 102    event:3

现在我使用 lua 脚本从给定的分数范围返回子集

var result = redis.call('zrangebyscore', 'mykey', start, stop, 'WITHSCORES')

lua-script 中的结果表会是什么样子? (因为我不能调试,所以我不得不问)

来自redis-doc:Redis 多批量回复 -> Lua 表(可能嵌套了其他 Redis 数据类型) - 这是我能找到的所有信息。

会是这样吗:

result = { 'event:1', 100, 'event:2', 101, 'event:3', 102 }

或喜欢

result = { 100, 'event:1', 101, 'event:2', 102, 'event:3' }

还是不一样?

【问题讨论】:

    标签: lua redis


    【解决方案1】:

    zrangebyscore ... withscores 的结果——或者任何从带有分数的排序集中读取的结果,实际上——将作为如下所示的 lua 表返回:

    result = { "event:1", "100", "event:2", "101" }
    

    价值第一,得分第二。值和分数都是字符串。

    【讨论】:

      【解决方案2】:

      假设您使用的可以写入标准输出,您可以添加转储函数并输出表格格式。

      我用

      function dump (tt, label,indent, done)
          if debug == true then
             if label == nil then
                label = 'Dump'
             end
              done = done or {}
              indent = indent or 0
              if type(tt) == "table" then
                  if indent == 0 then
                      io.write(string.rep (" ", indent))
                      io.write(label..'\n')
                  end
                  for key, value in pairs (tt) do
                      io.write(string.rep (" ", indent)) -- indent it
                      if type (value) == "table" and not done [value] then
                          done [value] = true
                          io.write(string.format("[%s] => table\n", tostring (key)));
                          io.write(string.rep (" ", indent+4)) -- indent it
                          io.write("(\n");
                          dump (value, tostring(key),indent + 7, done)
                          io.write(string.rep (" ", indent+4)) -- indent it
                          io.write(")\n");
                      else
                          io.write(string.format("[%s] => %s\n",
                          tostring (key), tostring(value)))
                      end
                  end
              else
                  io.write(tostring(label)..':'..tostring(tt))
              end
          else
              return
          end
      end
      

      因此,对于您的示例,您只需添加

      debug = true
      dump(var,'redis-table')
      

      【讨论】:

      • 很遗憾,io 模块不可用。有redis.log 和以下库:base、table、string、math、debug、cjson、cmsgpack。
      • 看redis的帮助,应该可以把io.write换成redis.log(redis.LOG_VERBOSE,value)。虽然结果格式不会那么好
      • redis.log(redis.LOG_VERBOSE, cjson.encode(result)) 可能更容易...不过没关系,因为答案在下面。但是提问者似乎已经抛弃了我们。 ;)
      猜你喜欢
      • 2021-01-14
      • 1970-01-01
      • 2020-04-20
      • 2013-09-23
      • 2021-12-25
      • 2018-08-05
      • 2014-04-12
      • 2016-02-13
      • 1970-01-01
      相关资源
      最近更新 更多