wtysos11 / blogWiki

Use to store public paper and organize them.
17 stars 4 forks source link

redis脚本中redis.call返回nil时的类型 #211

Open wtysos11 opened 3 years ago

wtysos11 commented 3 years ago

今天遇到了这个问题,搞了半个小时……

func TestHGet(t *testing.T){
    t.Log("")
    element0,err := redisClient.HGet(redisCtx,keyName,"0").Int()
    if err != nil{
        if err == redis.Nil{ //最终
            t.Log("got redis nil")
        }else{
            t.Error(err)
        }
    }
    t.Log("element value: ",element0)
    hgetNilValue := `
    local user_key = KEYS[1]
    local pos1 = tonumber(ARGV[1])

    local element = redis.call('hget',user_key,pos1)
    return type(element)
    `
    // 结果为0, 拿到的元素确实不为"0"
    //result,err := redisClient.Eval(redisCtx,hgetNilValue,[]string{keyName},"0").Int()
    //if err != nil{
    //  t.Error(err)
    //}else{
    //  t.Logf("redis script return value is %v",result)
    //}

    result,err := redisClient.Eval(redisCtx,hgetNilValue,[]string{keyName},"0").Result()
    if err != nil{
        t.Error(err)
    }else{
        t.Log(result)
    }
}

在Go中没有什么意外,拿到的是一个特殊的错误redis.Nil。但是在redis脚本内就很奇怪了,我直接返回拿到的类型是返回的是个redis: nil,一开始我以为是个字符串,搞了好久。 最终,我试了一下返回type(),结果是boolean,绝了。