2016-08-16 90 views
0

我有以下Redis的LUA脚本:Redis的LUA脚本条件选择错误return语句

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

作为回报我总是得到 '错误的',虽然下面的命令返回nil:

zscore stats test 

结果:

(nil) 

第一个命令的预期结果是'true'。我已经将第一个命令的键和参数更改为随机值,并且我总是得到'false'。任何人都可以帮助我吗?我正在使用Redis 2.8.17。

回答

2

请参阅documentation regarding type conversion,特别是这一行:

  • Redis的无散装答复,无多批量回复 - > Lua的假布尔类型

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

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

需要注意的是:

  1. Redis的协议没有布尔类型,因此你基本上返回字符串‘真’或‘假’。 ;
  2. 的逻辑是与直觉相反(如果为假,则真))

顺便说一句,虽然Lua中没有运动中ternary operator,它可以用下面的等效模拟:

eval "return redis.call('ZSCORE', KEYS[1], ARGV[1]) and 'false' or 'true'" 1 stats test 
+0

由于非常许多!我错过了那部分规格。 –