我正在尝试使用 Redis TYPE Lua 脚本中的命令(通过 EVAL 执行)
local key_type = redis.call("TYPE", key)
根据Redis的文档,这应该返回一个"none"
、"zset"
等的字符串
但是返回值的类型是lua table
。将值与字符串进行比较总是返回 false。
我已经设法通过将调用更改为
来解决这个问题local key_type = redis.call("TYPE", key)["ok"]
这个值确实是一个字符串并且在字符串比较命令中起作用。我担心这是我特定版本的 Redis 中的一个错误,当我升级时它会在未来的版本中中断。
有谁知道这是预期的行为还是错误?
最佳答案
TYPE
命令返回一个状态回复(也就是一个简单的字符串),例如"+list\r\n"
。
在 Redis 脚本方面,call
由 luaRedisCallCommand
实现它在幕后执行真正的 Redis 命令。
一旦成功执行,此函数将命令结果转换为redisProtocolToLuaType
。 .
当遇到状态回复时,此函数创建一个 Lua 表,以 "ok"
为键,状态回复为值(参见 redisProtocolToLuaType_Status
)。所以:
- 没有错误,
- 这就是为什么
redis.call("TYPE", key)
是一个表(因此您需要获取"ok"
键的值,因为做了,以获取key
的字符串类型)。
注意:当您直接返回表时,Redis 会注意获取与 “ok”
键关联的值,并将其作为状态回复返回,例如:
> EVAL 'return redis.call("TYPE", "foo")'
set
查看此 code section了解更多详情。
关于lua - 在 Redis/Lua 脚本中使用 TYPE 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21435315/