Redis Lua脚本疑问:哈希字段判断时nil值进入else分支问题
问题分析与解决:Redis Lua脚本中判断HGET返回值的坑
嘿,这个问题其实是Redis Lua脚本里一个很容易踩的类型转换坑,我来给你拆解清楚:
为什么你的判断失效了?
你以为redis.call("HGET", "nosuchkey", "nosuchfield")返回的是Lua的nil,但实际上Redis在Lua脚本里会把自己的nil值(也就是命令执行后没有结果的情况)映射成一个特殊的userdata类型值,也就是redis.null,而不是Lua原生的nil。
这就导致你的第一个条件tesid == nil永远不会成立——因为tesid根本不是Lua的nil,而是Redis自定义的一个特殊值。接下来第二个条件tesid == ""也不成立(毕竟它不是空字符串),所以代码直接走到了else分支,把label设成了"kkkk"。
正确的写法应该是怎样的?
你需要用Redis提供的redis.null来判断这个特殊的nil值,修改后的脚本如下:
local label = "oooo" local tesid = redis.call("HGET", "nosuchkey", "nosuchfield") if tesid == redis.null then label = "aaaa" elseif tesid == "" then label = "bbbb" else label = "kkkk" end return {tesid, label}
现在执行这个脚本,当键或字段不存在时,tesid等于redis.null,就会进入第一个分支,把label设为"aaaa",完全符合你的预期。
额外验证小技巧
如果你想直观确认tesid的类型,可以在脚本里临时加一句返回类型的代码:
return type(tesid)
执行后会返回userdata,这就能清晰看到它不是Lua原生的nil啦。
内容的提问来源于stack exchange,提问作者Catau
相关产品推荐
相关产品推荐

