我试图在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)
有关详细信息,请参阅此代码部分.