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

标签 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"

最佳答案

如果您引用 Redis EVAL documentation你可以看到 Redis 使用什么规则将 Lua 表转换为 Redis 回复:

  1. Lua table (array) -> Redis multi bulk reply (截断到第一个 nil 在 Lua 数组中(如果有的话))
  2. 带有单个 ok 字段的 Lua 表 -> Redis 状态回复
  3. 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/

相关文章:

ruby-on-rails - 用于 Lua Web 开发的类似 POW 的服务器( super 简单/无需配置)?

memory - Lua表内存?

mysql - 分布式爬虫和一致性

lua - Lua中的表内表

lua - 如何在lua中实现只读表?

c++ - 推送 Lua 表

xml - LuaXML 解析具有多个同名标签的 XML

c++ - 使用 SWIG 和 MinGW 创建的 Lua 模块,导致解释器在退出时崩溃

java - 使用 Spring Data 查询 Redis 中的嵌套对象

Redis zrange 和 zrangebyscore