问题是关于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}
答案 0 :(得分:1)
简答: tesid
为false
不 nil
。
Redis'nil
回复的转化规则如下:
nil
回复转换为Lua false
布尔类型。false
布尔类型转换为Redis'nil
回复。在您的情况下,HGET
会返回nil
,后者会转换为false
。因此tesid
是false
。它不等于nil
或""
,因此label
设置为kkk
。当您的代码返回tesid
作为返回值的一部分时,它会转换为Redis'nil
回复。这就是你得到{nil, kkk}