redis - 为什么 nil 检查失败

标签 redis lua

我正在使用 Lua 查询 Redis,并想检查 key 是否不存在,但我很困惑为什么我的代码无法正常工作:

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) 语句。

From the Lua Reference Manual 6.1 Basic Functions :

ipairs (t) Returns three values (an iterator function, the table t, and 0) so that the construction

 for i,v in ipairs(t) do body end

will iterate over the key–value pairs (1,t[1]), (2,t[2]), ..., up to the first nil value.

实际上,您不能使用任何标准迭代器来查找 nil 值。

如果您只想检查 bulk[1] 是否为 nil:

替换

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")
if not bulk[1] then return end

returnreturn nil 顺便说一句是相同的。

如果bulk[1]可能是有效的false,请显式检查与nil

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

之所以有效,是因为 bulk[1]0false,在这种情况下,您可以将其替换为 0 .

快速研究确认您从 Redis Lua 绑定(bind)中获得的是 false 值而不是 nil。所以使用 ipairs 应该没问题。您应该只检查该值是否等于 false,而不是 nil

关于redis - 为什么 nil 检查失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55591195/

相关文章:

php - 在 PHP +Redis +Pub/Sub +WebSockets (+NodeJS) 中实时聊天

redis - 使用 Redis 发布订阅。相对于 RabbitMQ 的优势/劣势

slaveof 的 redis 配置集失败

lua - Lua 语言中 switch 语句的替代方法是什么?

command-line - Lua(命令行)在执行后保持打开状态

npm - 无法在 debian stretch 中安装 redis-commander

node.js - 将redis.get分组2ms,然后通过mget执行

lua - 我们可以将 C++ 对象传递给 Lua 脚本吗

arrays - 如何隔离Lua中由星号分隔的数字?

c++ - 有条件地从 C++ 调用 Lua 函数