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

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

local key_type = redis.call("TYPE", key)

根据 Redis 文档,这应该返回一个字符串“none”、“zset”等。

然而返回值的类型是 lua table。将该值与字符串进行比较始终返回false。

我已经通过更改调用来解决了这个问题

local key_type = redis.call("TYPE", key)["ok"]

这个值确实是一个字符串,并且可以用于字符串比较命令。我担心这是我的特定版本的 Redis 中的一个 bug,并且当我升级到未来版本时它会出现问题。

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

点赞
用户1688185
用户1688185

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

有关更多详细信息,请参见 此代码部分

2014-01-29 21:43:57