有没有办法在Redis获得locking? (Node.js的)

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

我知道Redis尽力去做primefaces,但是这对于我的用例还不够。 想一想:设置被读取,以了解它是否满(有一个商业规则)。 如果它是完整的,那么会发生一些事情。 问题是,如果只剩下一个插槽,则两个半并发连接可以认为每个连接都是最后一个。 我得到溢出。

我有一种方法来保持连接“等待”很短的时间,其他最终需要更新设置状态?

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

使用另一个键作为“锁”是一个选项,还是它臭?

您可能正在寻找MULTI/EXEC WATCH 。 以下是两条线索遵循的模式:

 WATCH sentinel_key GET value_of_interest if (value_of_interest = FULL) MULTI SET sentinel_key = foo EXEC if (EXEC returned 1, ie succeeded) do_something(); else do_nothing(); else UNWATCH 

这样做的方式是, MULTIEXEC之间的所有命令排队,但直到EXEC被调用才EXEC 。 当EXEC被调用时,在实际执行排队的指令之前,它检查自从WATCH被设置以来是否已经改变了sentinel_key ; 如果有,则返回(nil) ,排队的命令将被丢弃。 否则,命令将作为一个块自动执行,并返回执行的命令数(本例中为1),让您知道您赢了比赛,并且可以调用do_something()

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

如何使用blpop来locking。 blpop key 5等待5秒钟。 在开始放置项目(识别队列不是空的)在关键。 获取锁的连接应该从键中删除项目。 下一个连接然后不能获得锁,因为空,但blpop有以下好的属性:

多个客户端可以阻止相同的密钥。 他们被排成一个队列,所以第一个被服务的人将是第一个以第一个BLPOP服务的方式开始等待的人。

当获得locking的连接完成任务时,应该将项目放回队列,然后下一个连接等待可以获得locking(项目)。