redis 中脚本检查哈希字段是否存在

这个问题涉及redis中的_lua脚本_。

我试图检查哈希表中是否存在某个字段,但是redis.call的返回值让我感到惊讶:

    EVAL 'local label = "oooo"; local tesid = redis.call("HGET", "nosuchkey", "nosuchfield"); if tesid == nil then label="aaaa" elseif tesid == "" then label="bbbb" else label = "kkkk" end; return {tesid,label}' 0

返回值是:

    1) (nil)
    2) "kkkk"

我不明白为什么我进入了那个else分支,label被设置为"kkkk",即使tesidnil,我认为它应该输出"aaaa"

为什么脚本会进入"kkkk"标签?

为了更好的阅读,我在这里粘贴了脚本:

    local label = "oooo"
    local tesid = redis.call("HGET", "nosuchkey", "nosuchfield")
    if tesid == nil
    then
        label="aaaa"
    elseif tesid == ""
    then
        label="bbbb"
    else
        label = "kkkk"
    end
    return {tesid,label}
点赞
用户5384363
用户5384363

简短回答: tesidfalse不是 nil

Redis 对于 nil 回复的转换规则如下:

  1. Redis 的 nil 回复会被转换成 Lua 的 false 布尔类型。
  2. Lua 的 false 布尔类型会被转换成 Redis 的 nil 回复。

在你的情况下,HGET 返回 nil,这被转换为 false。所以 tesidfalse。它既不等于 nil 也不等于 "",所以 label 被设置为 kkk。当你的代码将 tesid 作为返回值的一部分返回时,它会被转换为 Redis 的 nil 回复。这就是为什么你得到了 {nil, kkk}

2018-04-11 11:09:35