节点Redis - 使用EX和NX设置?

时间:2013-04-07 10:37:01

标签: node.js locking redis

Redis建议使用带有可选参数的SET作为锁定机制的方法。即“SET lock 1 EX 10 NX”仅在不存在时设置锁定,并在10秒后过期。

我正在使用Node Redis,它有一个set()方法,但我不知道如何传递额外的参数以使密钥过期,如果密钥已经存在则不会被创建,或者即使它是可能的

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

2 个答案:

答案 0 :(得分:35)

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

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

因此,安装了Redis 2.6.12后,如果变量不存在,则跟随方法调用将使用节点redis设置变量,并将其设置为在5分钟后过期:

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

答案 1 :(得分:4)

您可以使用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);
});