有没有办法在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
这样做的方式是, MULTI
和EXEC
之间的所有命令排队,但直到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(项目)。