【问题标题】:Redis Lua script - HMGET returned bulk contains nil but is not recognized as nilRedis Lua 脚本 - HMGET 返回的批量包含 nil 但未被识别为 nil
【发布时间】:2020-04-20 16:59:16
【问题描述】:

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

尝试在 Redis 中评估以下四个 Lua 脚本中的每一个。我的问题是为什么如果 HMGET 返回 nil 时将值设置为 0 的 ternary operation 在第四个脚本中不起作用。

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)

【问题讨论】:

    标签: redis lua


    【解决方案1】:

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

    来自doc

    Redis Nil 批量回复和 Nil 多批量回复 -> Lua false boolean 类型

    在 Redis 中,HMGET 为第二个字段返回 Nil 回复,即 bulk[1],并且在将回复传递给 Lua 时将其转换为 false。所以你的第四个脚本不起作用,因为bulk[1] == nilfalse

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

    在您的第三个脚本中,false 类型的 bulk[1] 被返回,Redis 将 false 转换为 Nil 回复

    【讨论】:

    • 哇,谢谢!我之前浏览过那个“EVAL - Redis”文档,在调试时没有想到它。追问:在第4个脚本中,识别Redis返回bulk[1] = nil的推荐方法是什么,因此我们应该将0分配给`rate?
    • 检查bulk[1] 是否为false。另外,由于您要返回一个数字,因此您应该在返回之前将bulk[1] 转换为数字:local rate = (bulk[1] == false and 0 or tonumber(bulk[1]))
    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 2018-05-02
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    相关资源
    最近更新 更多