一尘不染

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

redis

当我通过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"

阅读 503

收藏
2020-06-20

共1个答案

一尘不染

如果您参考Redis
EVAL文档
,则可以看到Redis将Lua表转换为Redis回复所使用的规则:

  1. Lua表(数组)-> Redis多批量回复( 如果有的话,将被截断为Lua数组中的第一个nil
  2. Lua表带有单个ok字段-> 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
2020-06-20