Cou*_*les 15 locking redis node.js
Redis建议使用带有可选参数的SET作为锁定机制的方法.即"SET lock 1 EX 10 NX"仅在它不存在时才设置锁定,并且在10秒后过期.
我正在使用Node Redis,它有一个set()方法,但我不知道如何传递其他参数以使密钥过期,如果它已经存在则不会被创建,或者即使它是可能的.
也许我必须使用setnx()和expire()作为单独的调用?
Cou*_*les 37
在阅读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) {...});
Run Code Online (Sandbox Code Playgroud)
您可以使用 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
Run Code Online (Sandbox Code Playgroud)
您可以像这样从 node_redis 调用它:
client.eval(setnex_lua, 0, "mykey", 10, "myvalue", function (err, res) {
console.dir(err);
console.dir(res);
});
Run Code Online (Sandbox Code Playgroud)
值得注意的是,node-redis v4从那时起,该包发生了重大变化,其中之一是函数默认返回 Promise,并且可以使用 JavaScript 对象作为可选参数来指定命令的修饰符:
await client.set('key', 'value', {
EX: 300,
NX: true
});
Run Code Online (Sandbox Code Playgroud)
此外,您可以使用以下命令运行您想要的任何命令sendCommand:
await client.sendCommand(['SET', 'key', 'value', 'NX', 'EX', 300]);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11676 次 |
| 最近记录: |