当我通过 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"
最佳答案
如果您引用 Redis EVAL
documentation你可以看到 Redis 使用什么规则将 Lua 表转换为 Redis 回复:
- Lua table (array) -> Redis multi bulk reply (截断到第一个 nil 在 Lua 数组中(如果有的话))
- 带有单个 ok 字段的 Lua 表 -> Redis 状态回复
- Lua table with a single err field -> Redis error reply
所以除了特殊情况 2 和 3 之外,Redis 假定您的表是一个序列(即列表),这意味着它读取 retv[1], retv[2], ...
直到它遇到一个 nil
元素(这里是对应的 source code section )。
这解释了为什么 retv["test"]
在您的案例中被忽略。
如果您更改代码:
local retv = {"This", "is", "a", "bug" }
retv[5] = 1000
return retv
然后返回这个额外的元素:
1) "This"
2) "is"
3) "a"
4) "bug"
5) (integer) 1000
关于lua - Redis - Lua 表作为返回值 - 为什么这不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24298763/