【发布时间】:2011-10-13 08:48:04
【问题描述】:
我的 Node.js 应用程序接受来自外部的连接。每个连接处理程序在 Redis 上读取一个 SET,最终修改该集合本身,然后继续。问题是同时另一个异步连接可以尝试读取相同的 SET 并尝试更新它或根据它读取的内容决定下一步。
我知道 Redis 尽最大努力实现原子化,但这对于我的用例来说还不够。想一想:读取集合以了解它是否已满(有一个业务规则)。如果它已满,那么就会发生一些事情。问题是如果只剩下一个插槽,两个半并发连接可能会认为每个都是最后一个。我得到一个溢出。
我有办法在很短的时间内保持连接“等待”另一个最终需要更新设置状态吗?
我认为这是一个极端情况,非常非常不幸......但你知道:)
使用另一把钥匙作为“锁”是一种选择,还是很臭?
【问题讨论】:
-
我不想把萨尔瓦多的回答当作我的。他之前已经解决了这个问题。使用 SETNX 和 WATCH 来模拟锁。 github.com/antirez/redis/pull/41
标签: asynchronous concurrency node.js redis