Redis 为什么零检查失败
我正在使用Lua查询redis,希望检查是否有密钥不存在,但对我的代码不起作用的原因感到困惑:Redis 为什么零检查失败,redis,lua,Redis,Lua,我正在使用Lua查询redis,希望检查是否有密钥不存在,但对我的代码不起作用的原因感到困惑: local bulk = redis.call("HMGET", KEYS[1], "p1", "p2") for i, v in ipairs(bulk) do if (i == 1) then if (v == nil) then return nil -- This is never entered end end end
local bulk = redis.call("HMGET", KEYS[1], "p1", "p2")
for i, v in ipairs(bulk) do
if (i == 1) then
if (v == nil) then
return nil -- This is never entered
end
end
end
但是,以下代码不起作用:
local bulk = redis.call("HMGET", KEYS[1], "p1", "p2")
for i, v in ipairs(bulk) do
if (i == 1) then
v = v or 0
if (v == 0) then
return nil -- This does work
end
end
end
这里发生了什么?您正在使用ipairs在表中进行迭代。迭代将在第一个元素为nil时结束。因此,在for循环中,v永远不能等于nil。
因此,永远不会输入if v==nil语句
:
ipairs t通过迭代器函数返回三个值,即表t,
和0,以便构造
for i,v in ipairs(t) do body end
将迭代键值对1,t[1],2,t[2],…,直到第一个nil值
实际上,您不能使用任何标准迭代器来查找nil值
如果只想检查批量[1]是否为零:
替换
local bulk = redis.call("HMGET", KEYS[1], "p1", "p2")
for i, v in ipairs(bulk) do
if (i == 1) then
if (v == nil) then
return nil -- This is never entered
end
end
end
与
return和return nil是相同的
在这种情况下,批量[1]可能是有效的假检查,而不是显式的零检查
if bulk[1] == nil then return end
此代码:
local bulk = redis.call("HMGET", KEYS[1], "p1", "p2")
for i, v in ipairs(bulk) do
if (i == 1) then
v = v or 0
if (v == 0) then
return nil -- This does work
end
end
end
因为大容量[1]为0或false,在这种情况下,您可以将其替换为0
快速重新搜索确认您从Redis Lua绑定中得到的是假值,而不是零。因此,使用IPAIR应该可以。您只需检查该值是否等于false,而不是nil。@James下次,只需打印bulk[1],您就会立即知道它是false
local bulk = redis.call("HMGET", KEYS[1], "p1", "p2")
for i, v in ipairs(bulk) do
if (i == 1) then
v = v or 0
if (v == 0) then
return nil -- This does work
end
end
end