19

Redis 推荐一种使用SET可选参数作为锁定机制的方法。即SET lock 1 EX 10 NX只有当它不存在并且它会在 10 秒后过期时才会设置一个锁。

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

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

4

3 回答 3

48

阅读 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) {...});
于 2013-04-30T09:52:57.733 回答
5

您可以使用 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);
});
于 2013-04-17T16:54:39.877 回答
0

Node-Redis v4+ 更改

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

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

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

await client.sendCommand(['SET', 'key', 'value', 'NX', 'EX', 300]);
于 2022-01-17T11:51:54.913 回答