Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redis 为什么零检查失败_Redis_Lua - Fatal编程技术网

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

我正在使用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
        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