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

当我将这段代码通过 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"
点赞
用户1688185
用户1688185

如果您参考 Redis EVAL 文档,您可以看到 Redis 如何将 Lua 表格转换为 Redis 响应:

  1. Lua 表格(数组)- > Redis 多批量回复( **如果有,则截断到 Lua 数组中的第一个 nil**)
  2. 具有单个 ok 字段的 Lua 表格 - > Redis 状态回复
  3. 具有单个 err 字段的 Lua 表格 - > Redis 错误回复

因此,除了特殊情况 2 和 3,Redis 假定您的表格是一个序列(即列表),这意味着它读取 retv[1],retv[2],...,直到遇到 nil 元素(这里是相应的源代码部分)。

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

如果您更改代码为:

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

然后会返回这个额外的元素:

1) "This"
2) "is"
3) "a"
4) "bug"
5) (integer) 1000
2014-06-19 08:56:52
用户125351
用户125351

Answer from @deltheil is valid.

记住您可以使用 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}"
2016-05-14 05:01:21