我试图在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中的一个错误,当我升级时它将在未来的版本中破坏。
有人知道这是预期的行为还是错误?
答案 0 :(得分:11)
TYPE
命令返回状态回复(a.k.a简单字符串),例如"+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。