【问题标题】:Node Redis - SET with EX and NX?节点 Redis - 使用 EX 和 NX 设置?
【发布时间】:2013-04-07 10:37:01
【问题描述】:

Redis 推荐使用带有可选参数的SET 作为锁定机制的方法。 IE。 SET lock 1 EX 10 NX 只会在不存在的情况下设置锁,并且会在 10 秒后过期。

我正在使用 Node Redis,它有一个 set() 方法,但我不确定如何向它传递其他参数以使密钥过期并且如果它已经存在则不被创建,或者即使它是可能的.

也许我必须将setnx()expire() 用作单独的调用?

【问题讨论】:

    标签: node.js locking redis


    【解决方案1】:

    阅读 Node Redis 源代码后,我发现所有方法都接受任意数量的参数。当生成参数数量不正确的错误时,这是​​由 Redis 而不是节点模块生成的。

    我早期尝试提供多个参数是因为我只安装了 Redis 2.2.x,其中 SET 只接受 2.6.12 的 NX 和 EX 参数。

    所以在安装 Redis 2.6.12 后,以下方法调用将与 node redis 一起使用,如果它不存在,则设置一个变量,并将其设置为 5 分钟后过期:

    $client->set('hello', 'world', 'NX', 'EX', 300, function(err, reply) {...});
    $client->set(['hello', 'world', 'NX', 'EX', 300], function(err, reply) {...});
    

    【讨论】:

    • 好的,但是那个->是c++或者php,不是nodejs,我觉得是错字
    【解决方案2】:

    您可以使用 Lua 脚本创建自己的 setnex 命令。所有 Lua 脚本都以原子方式运行,因此您不必担心其他客户端会更改您已在脚本中读取的数据。

    -- setnex.lua
    local key = ARGV[1]
    local expiry = ARGV[2]
    local value = ARGV[3]
    local reply = redis.call("SETNX", key, value)
    if 1 == reply then 
      redis.call("EXPIRE", key, expiry) 
    end
    return reply
    

    你可以像这样从 node_redis 调用它:

    client.eval(setnex_lua, 0, "mykey", 10, "myvalue", function (err, res) {
        console.dir(err);
        console.dir(res);
    });
    

    【讨论】:

      【解决方案3】:

      Node-Redis v4+ 变化

      值得注意的是,从node-redisv4 开始,包发生了重大变化,其中之一是函数默认返回promise,并且可以使用JavaScript 对象作为可选参数来指定命令的修饰符:

      await client.set('key', 'value', {
        EX: 300,
        NX: true
      });
      

      此外,您可以使用sendCommand 运行任何您想要的命令:

      await client.sendCommand(['SET', 'key', 'value', 'NX', 'EX', 300]);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 2016-01-21
        • 1970-01-01
        • 2019-07-25
        • 2013-10-20
        • 2018-09-03
        相关资源
        最近更新 更多