Redis LUA脚本条件选择错误的返回语句

我有下面的Redis LUA脚本:

eval "if redis.call('ZSCORE', KEYS[1], ARGV[1]) == nil then return 'true' else return 'false' end" 1 stats test

最终结果总是得到'false',尽管以下命令返回nil:

zscore stats test

结果:

(nil)

第一个命令的预期结果将会是'true'。我已经随机更改了第一个命令的键和参数,但总是得到'false'。有人可以帮我解决吗?我使用的是Redis 2.8.17.

点赞
用户3160475
用户3160475

请参考有关类型转换的文档,特别是这一行:

  • Redis Nil 响应和 Nil 多条响应 -> Lua false 布尔类型

这意味着为了让您的脚本按预期“工作”,您需要按如下方式更改它:

eval "if redis.call('ZSCORE', KEYS[1], ARGV[1]) == false then return 'true' else return 'false' end" 1 stats test

请注意:

  1. Redis 的协议没有布尔类型,所以您基本上是在返回字符串“true”或“false”。
  2. 逻辑是反直觉的(如果是 false,则返回 true);)

顺便提一下,尽管 Lua 没有三元运算符,但可以使用以下等效方式进行模拟:

eval "return redis.call('ZSCORE', KEYS[1], ARGV[1]) and 'false' or 'true'" 1 stats test
2016-08-16 11:58:17