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

时间:2018-04-11 09:31:51

标签: lua 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" - 当tesid为nil时,我认为应该输出"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}

1 个答案:

答案 0 :(得分:1)

简答: tesidfalse nil

Redis'nil回复的转化规则如下:

  1. Redis nil回复转换为Lua false布尔类型。
  2. Lua false布尔类型转换为Redis'nil回复。
  3. 在您的情况下,HGET会返回nil,后者会转换为false。因此tesidfalse。它不等于nil"",因此label设置为kkk。当您的代码返回tesid作为返回值的一部分时,它会转换为Redis'nil回复。这就是你得到{nil, kkk}

    的原因