当我通过redis EVAL运行此代码时,它不会返回任何结果。知道为什么这不起作用吗?
redis-cli EVAL "$(cat bug.lua)" 0
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"
答案 0 :(得分:10)
如果您参考Redis EVAL
documentation,您可以看到Redis用于将Lua表转换为Redis回复的规则是什么:
因此除了特殊情况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}"