asynchronous - 有没有办法在 Redis 中获取锁? ( Node .js)

标签 asynchronous concurrency node.js redis

我的 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/

相关文章:

performance - Web 应用程序中的并发

python - 在多线程生产者-消费者模式下,如何让工作线程在工作完成后退出?

node.js - Sequelize 连接到 heroku postgres 数据库时卡住了

java - CompletableFuture.allOf 已完成,即使其列表中的一个 CompletableFuture 尚未完成

javascript - 如何将synchronize.js 与 Node 的fs.exists 一起使用?

c# - 单一方法中的多个等待

swift - 如何处理核心数据的并发

node.js - Mongoose.js - 人口和其他领域?

node.js - 如何在 Express 中布置 Handlebars 部分

javascript - 如何按顺序运行一系列 Promise