Redis - Lua表作为返回值 - 为什么这不起作用

时间:2014-06-19 04:24:44

标签: lua redis lua-table

当我通过redis EVAL运行此代码时,它不会返回任何结果。知道为什么这不起作用吗?

redis-cli EVAL "$(cat bug.lua)" 0

bug.lua

local retv = {}
retv["test"] = 1000

return retv

如果我初始化表,则单独打印值。

$ cat bug.lua 
--!/usr/bin/env lua


local retv = {"This", "is", "a", "bug" }
retv["test"] = 1000

return retv

$ redis-cli EVAL "$(cat bug.lua)" 2 a b
1) "This"
2) "is"
3) "a"
4) "bug"

2 个答案:

答案 0 :(得分:10)

如果您参考Redis EVAL documentation,您可以看到Redis用于将Lua表转换为Redis回复的规则是什么:

  1. Lua table(array) - > Redis多批量回复(截断到第一个 在Lua数组中没有任何内容
  2. 具有单个ok字段的Lua表 - > Redis状态回复
  3. 具有单个错误字段的Lua表 - > Redis错误回复
  4. 因此除了特殊情况2和3之外,Redis假设您的表是一个序列(即列表),这意味着它会在遇到retv[1], retv[2], ...元素之前读取nil(这里是相应的{{3} }})。

    这解释了为什么在您的情况下会忽略retv["test"]

    如果您使用以下代码更改代码:

    local retv = {"This", "is", "a", "bug" }
    retv[5] = 1000
    return retv
    

    然后返回此附加元素:

    1) "This"
    2) "is"
    3) "a"
    4) "bug"
    5) (integer) 1000
    

答案 1 :(得分:5)

来自@deltheil的回答是有效的。

请记住,您可以使用cjson库打包表并将其传递给消费者。

你的lua文件:

local retv = {"This", "is", "a", "bug" }
retv["test"] = 1000

return cjson.encode(retv)

命令:

redis-cli EVAL "$(cat bug.lua)" 0

结果:

"{\"1\":\"This\",\"2\":\"is\",\"3\":\"a\",\"4\":\"bug\",\"test\":1000}"