Asynchronous 有没有办法获得Redis的锁?(Node.js)

Asynchronous 有没有办法获得Redis的锁?(Node.js),asynchronous,concurrency,node.js,redis,Asynchronous,Concurrency,Node.js,Redis,My Node.js应用程序接受来自外部的连接。每个连接处理程序在Redis上读取一个集合,最终修改集合本身,然后继续。问题是,与此同时,另一个异步连接可以尝试读取同一个集合并尝试更新它,或者根据读取的内容决定下一步 我知道Redis尽了最大努力实现原子化,但这对于我的用例来说还不够。想想看:读取集合是为了理解它是否已满(这有一个业务规则)。如果已经满了,就会发生一些事情。问题是,如果只剩下一个插槽,两个半并发连接可能会认为每一个都是最后一个。而我得到了一个溢出 我有没有办法让一个连接在很短的时

My Node.js应用程序接受来自外部的连接。每个连接处理程序在Redis上读取一个集合,最终修改集合本身,然后继续。问题是,与此同时,另一个异步连接可以尝试读取同一个集合并尝试更新它,或者根据读取的内容决定下一步

我知道Redis尽了最大努力实现原子化,但这对于我的用例来说还不够。想想看:读取集合是为了理解它是否已满(这有一个业务规则)。如果已经满了,就会发生一些事情。问题是,如果只剩下一个插槽,两个半并发连接可能会认为每一个都是最后一个。而我得到了一个溢出

我有没有办法让一个连接在很短的时间内“等待”另一个最终需要更新设置状态

我认为这是一个角落的情况,非常非常不幸。。。但你知道:)

使用另一把钥匙作为“锁”是一种选择,还是很臭?

用它来锁怎么样
blpop键5
等待
键5秒钟。开始时,将项(以标识队列不为空)放在键处。获取锁的连接应删除钥匙上的项目。下一个连接无法获取锁,因为为空,但blpop具有以下优良属性:

多个客户端可以为同一个密钥进行阻止。它们被放进一个盒子里 排队,所以第一个被服务的将是开始等待的那个 早些时候,以先到先得的方式


当获取锁的连接完成任务后,它应该将项放回队列中,然后等待的下一个连接可以获取锁(项)。

您可能正在使用
MULTI/EXEC
查看
。以下是两个线程遵循的模式:

WATCH sentinel_key
GET value_of_interest
if (value_of_interest = FULL)
    MULTI
    SET sentinel_key = foo
    EXEC
    if (EXEC returned 1, i.e. succeeded)
        do_something();
    else
        do_nothing();
else
    UNWATCH
其工作方式是将
MULTI
EXEC
之间的所有命令排队,但在调用
EXEC
之前不会实际执行。调用
EXEC
时,在实际执行排队指令之前,它会检查
sentinel_键
是否在设置
WATCH
后发生了任何变化;如果有,则返回
(nil)
,并丢弃排队的命令。否则,命令将作为一个块自动执行,并返回执行的命令数(本例中为1),让您知道您赢得了比赛,并且可以调用
do\u something()


它在概念上类似于Unix系统调用的
fork()/exec()
fork()返回值告诉您是哪个进程(父进程还是子进程)。在这种情况下,它会告诉你你是否赢得了比赛。

我不想在这里重复萨尔瓦托雷的回答。他以前也提到过这个问题。使用SETNX和WATCH模拟锁。似乎正是我需要的。不过,我必须检查它在Node.js进程中的性能。乌波波特,至少:)@Claudio这就是你想要的答案,但你把另一个标记为正确答案“D