【发布时间】:2013-04-07 10:37:01
【问题描述】:
Redis 推荐使用带有可选参数的SET 作为锁定机制的方法。 IE。 SET lock 1 EX 10 NX 只会在不存在的情况下设置锁,并且会在 10 秒后过期。
我正在使用 Node Redis,它有一个 set() 方法,但我不确定如何向它传递其他参数以使密钥过期并且如果它已经存在则不被创建,或者即使它是可能的.
也许我必须将setnx() 和expire() 用作单独的调用?
【问题讨论】:
Redis 推荐使用带有可选参数的SET 作为锁定机制的方法。 IE。 SET lock 1 EX 10 NX 只会在不存在的情况下设置锁,并且会在 10 秒后过期。
我正在使用 Node Redis,它有一个 set() 方法,但我不确定如何向它传递其他参数以使密钥过期并且如果它已经存在则不被创建,或者即使它是可能的.
也许我必须将setnx() 和expire() 用作单独的调用?
【问题讨论】:
阅读 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,我觉得是错字
您可以使用 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);
});
【讨论】:
值得注意的是,从node-redisv4 开始,包发生了重大变化,其中之一是函数默认返回promise,并且可以使用JavaScript 对象作为可选参数来指定命令的修饰符:
await client.set('key', 'value', {
EX: 300,
NX: true
});
此外,您可以使用sendCommand 运行任何您想要的命令:
await client.sendCommand(['SET', 'key', 'value', 'NX', 'EX', 300]);
【讨论】: