很抱歉标题含糊不清。希望下面的例子能解释我的困惑。
尝试在 Redis 中评估以下四个 Lua 脚本中的每一个。我的问题是,如果返回 nil,为什么将值设置为 0 的三元运算HMGET
在第 4 个脚本中不起作用。
local bulk = {nil,nil,nil}
return bulk[1] -- nil (good)
-- Proof that ternary operator works
local bulk = {nil,nil,nil}
local rate = (bulk[1] == nil and 0 or bulk[1])
return rate -- 0 (good)
-- Proof that first element in HMGET results is nil
local bulk = redis.call('hmget', 'k1', 'f1', 'f2')
return bulk[1] -- nil (good)
-- Why does ternary op fail on HMGET results?
local bulk = redis.call('hmget', 'k1', 'f1', 'f2')
local rate = (bulk[1] == nil and 0 or bulk[1])
return rate -- nil (bad, want 0)
因为bulk[1]
是false
,而不是nil
。
从文档中:
Redis 无批量回复和零多批量回复 -> Lua 假布尔类型
在 Redis 中,HMGET
返回第二个字段的Nil 回复,即bulk[1]
,当回复传递给 Lua 时,它会转换为false
。所以你的第 4 个脚本不起作用,因为bulk[1] == nil
是false
.
Lua boolean false -> Redis Nil 批量回复。
在第三个脚本中,返回类型false
的bulk[1]
,并且 Redis 将false
转换为Nil 回复