Redis Lua脚本 - HMGET返回的bulk包含nil但不被识别为nil

抱歉标题不太明确。希望下面的示例能够解释我的困惑。

尝试在Redis中评估以下四个Lua脚本。我的问题是为什么在第四个脚本中,将值设置为0的三元运算符(http://lua-users.org/wiki/TernaryOperator)在HMGET返回nil时无法工作。

local bulk = {nil,nil,nil}
return bulk[1] -- nil(好的)

-- 证明三元运算符可以工作
local bulk = {nil,nil,nil}
local rate =(bulk[1] == nil and 0 or bulk[1])
return rate -- 0(好的)

-- 证明HMGET结果中的第一个元素是nil
local bulk = redis.call('hmget''k1''f1''f2'return bulk[1] -- nil(好的)

-- 为什么HMGET结果上的三元op失败?
local bulk = redis.call('hmget', 'k1','f1','f2'local rate =(bulk[1] == nil and 0 or bulk[1])
return rate -- nil(错误,应为0)
点赞
用户5384363
用户5384363

因为 bulk[1]false,而不是 nil

文档 中可以看出:

Redis 的空 bulk 回复和空 multi bulk 回复 -> Lua 的 false boolean 类型

在 Redis 中,HMGET 对于第二个字段即 bulk[1] 会返回 _空回复_,并在将回复传递给 Lua 时转换为 false。因此你的第四个脚本行不通,因为 bulk[1] == nil 的结果是 false

Lua 中的 false boolean -> Redis 的空 bulk 回复

在你的第三个脚本中,返回的是类型为 falsebulk[1],Redis 将 false 转换为 _空回复_。

2020-01-01 23:55:26