首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node Redis -使用EX和NX设置?

Node Redis -使用EX和NX设置?
EN

Stack Overflow用户
提问于 2013-04-07 18:37:01
回答 3查看 16.4K关注 0票数 18

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

我使用的是Node Redis,它有一个set()方法,但我不确定如何向它传递额外的参数,以便在密钥已经存在或可能的情况下使密钥过期而不被创建。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-30 17:52:58

在阅读Node Redis源代码后,我发现所有方法都接受任意数量的参数。当产生参数个数错误的错误时,是Redis而不是node模块产生的。

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

因此,在安装了Redis 2.6.12的情况下,以下方法调用将与节点redis一起使用,以设置一个不存在的变量,并将其设置为5分钟后过期:

代码语言:javascript
复制
$client->set('hello', 'world', 'NX', 'EX', 300, function(err, reply) {...});
$client->set(['hello', 'world', 'NX', 'EX', 300], function(err, reply) {...});
票数 47
EN

Stack Overflow用户

发布于 2013-04-18 00:54:40

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

代码语言:javascript
复制
-- 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调用它:

代码语言:javascript
复制
client.eval(setnex_lua, 0, "mykey", 10, "myvalue", function (err, res) {
    console.dir(err);
    console.dir(res);
});
票数 6
EN

Stack Overflow用户

发布于 2022-01-17 11:51:55

Node-Redis v4+更改

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

代码语言:javascript
复制
await client.set('key', 'value', {
  EX: 300,
  NX: true
});

此外,您还可以使用sendCommand运行所需的任何命令

代码语言:javascript
复制
await client.sendCommand(['SET', 'key', 'value', 'NX', 'EX', 300]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15861424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档