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

时间:2014-01-29 15:21:07

标签: lua redis

我试图在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中的一个错误,当我升级时它将在未来的版本中破坏。

有人知道这是预期的行为还是错误?

1 个答案:

答案 0 :(得分:11)

TYPE命令返回状态回复(a.k.a简单字符串),例如"+list\r\n"

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

成功执行后,此函数会将命令结果转换为redisProtocolToLuaType

遇到状态回复时,此功能创建一个Lua表,其中"ok"为关键,状态回复为值(请参阅redisProtocolToLuaType_Status)。所以:

  • 没有错误,
  • 这就是为什么redis.call("TYPE", key)是一个表(因此你需要像你一样获取"ok"键的值,以便将key的类型作为字符串获取。

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

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

有关详细信息,请参阅此code section