避免 redis 竞争条件

Posted

技术标签:

【中文标题】避免 redis 竞争条件【英文标题】:avoid redis race condition 【发布时间】:2015-01-30 09:36:18 【问题描述】:

我试图弄清楚如何在更新 redis 时避免出现竞争情况。这是我的场景:由于查询参数长度限制,我有一条消息被分成几个 http GET 请求。我正在使用 redis 来存储临时消息块,当我拥有所有块时,我将它们连接起来并将它们存储在数据库中。块用消息 id 标记,我将块存储在以“$”分隔的字符串中,由消息 id 键入。当我得到一个新块时,我得到了块字符串,然后附加新块+'$',并将其设置回redis。问题是我担心如果我调用 set,并且在我下一次 get 之前那个 set 命令还没有完成执行,我将没有最新的块字符串。如果我有一个单一的 redis 客户端,也许这会缓解这个问题,因为大概命令是按照在服务器上接收的顺序执行的?任何见解都值得赞赏,包括有关如何以更理智的方式构建消息重组的建议?谢谢你。

【问题讨论】:

【参考方案1】:

这里最简单的做法是使用 Redis 的 APPEND 命令 - 这将节省您获取值的往返过程并确保操作的原子性。

【讨论】:

以上是关于避免 redis 竞争条件的主要内容,如果未能解决你的问题,请参考以下文章

如何动态锁定线程并避免竞争条件

仅在Rust中编写的软件能完全避免竞争条件吗?

增加计数器时避免竞争条件

如何避免 VxWorks 中条件变量中的竞争条件

如何在我的 Rails 应用程序中避免竞争条件?

如何在记录付款和运行余额的 Rails 模型中避免竞争条件?