Redis Lua 脚本 - HMGET 返回的批量包含 nil,但未被识别为 nil



很抱歉标题含糊不清。希望下面的例子能解释我的困惑。

尝试在 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] == nilfalse.

Lua boolean false -> Redis Nil 批量回复。

在第三个脚本中,返回类型falsebulk[1],并且 Redis 将false转换为Nil 回复

最新更新