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

And*_*ate 9 lua redis

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

local key_type = redis.call("TYPE", key)
Run Code Online (Sandbox Code Playgroud)

据Redis的文档,这应返回的字符串"none","zset"等等.

但是返回值的类型是lua table.将值与字符串进行比较始终返回false.

我设法通过更改呼叫来解决问题

local key_type = redis.call("TYPE", key)["ok"]
Run Code Online (Sandbox Code Playgroud)

该值确实是一个字符串,并且在字符串比较命令中起作用.我担心这是我特定版本的Redis中的一个错误,当我升级时它将在未来版本中破坏.

有谁知道这是预期的行为,还是一个错误?

del*_*eil 11

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

在Redis脚本方面,call实现luaRedisCallCommand了在幕后执行真正的Redis命令.

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

遇到状态回复时,此函数创建一个带有"ok"的Lua表,并将状态回复为值(请参阅参考资料redisProtocolToLuaType_Status).所以:

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

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

> EVAL 'return redis.call("TYPE", "foo")' 
set
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此代码部分.