我的 Node.js 应用程序接受来自外部的连接。每个连接处理程序读取 Redis 上的一个 SET,最终修改该集合本身,然后继续。问题是与此同时,另一个异步连接可以尝试读取同一个 SET 并尝试更新它或根据读取的内容决定下一步。
我知道 Redis 尽最大努力实现原子性,但这对我的用例来说还不够。想一想:读取集合以了解它是否已满(有一个业务规则)。如果它已满,则会发生一些事情。问题是如果只剩下一个插槽,两个半并发连接可能认为每个都是最后一个。我溢出了。
我有办法让连接“等待”很短的时间,而另一个最终需要更新设置状态吗?
我认为这是一个极端情况,非常非常不幸......但你知道:)
使用另一把 key 作为“锁”是一种选择,还是它很臭?
最佳答案
如何使用 blpop做锁定。 blpop key 5
等待 5 秒 key
。在开始时将项目(以识别队列不为空)放在关键位置。获取锁的连接应该从 key 中删除项目。 next connect 则无法获取锁,因为是空的,但 blpop 具有以下 nice 属性:
Multiple clients can block for the same key. They are put into a queue, so the first to be served will be the one that started to wait earlier, in a first-BLPOP first-served fashion.
当获得锁的连接完成任务时,它应该将项目放回队列中,然后下一个等待的连接可以获取锁(项目)。
关于asynchronous - 有没有办法在 Redis 中获取锁? ( Node .js),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6829662/