在Redis/Lua脚本中使用TYPE命令

12

我试图在Lua脚本中(通过EVAL执行)使用Redis的TYPE命令

local key_type = redis.call("TYPE", key)
根据Redis文档,这应该返回一个字符串"none""zset"等。但是返回值的类型是lua table。将其与字符串进行比较始终会返回false。我已经通过更改调用来解决了这个问题。
local key_type = redis.call("TYPE", key)["ok"]

这个值确实是一个字符串,可以在字符串比较命令中使用。我担心这是我的特定版本的Redis中的一个错误,在将来的版本升级时可能会出现问题。

有人知道这是否是预期行为,还是一个错误吗?

1个回答

14

TYPE 命令会返回一个状态回复(也称为简单字符串),例如 "+list\r\n"

在 Redis 脚本方面,call 是由 luaRedisCallCommand 实现的,它在幕后执行真正的 Redis 命令。

这个函数成功执行后,会使用redisProtocolToLuaType将命令结果转换。

当遇到一个状态回复时,该函数创建一个 Lua 表,以 "ok" 作为键,以状态回复作为值(参见redisProtocolToLuaType_Status)。因此:

  • 没有 bug,
  • 这就是为什么 redis.call("TYPE", key) 是一个表格(因此您需要像之前一样获取键为"ok" 的值,以将 key 的类型作为字符串返回)。

注意:当您直接返回表时,Redis 会负责获取与 "ok" 键关联的值,并将其作为状态回复返回,例如:

> EVAL 'return redis.call("TYPE", "foo")' 
set

查看此代码部分以获取更多详情。


感谢您详细而专业的回答。 - Andrew Newdigate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接