【问题标题】:Redis ltrim - possible race condition?Redis ltrim - 可能的竞争条件?
【发布时间】:2013-05-13 08:00:31
【问题描述】:

Redis 的 ltrim 和 rpush 是否存在竞争条件?

例如,假设我的 redis 列表有这些项目: [1、2、3、4、5]

我打电话给ltrim list 4 -1 这基本上应该将列表切成 [5]

但是让我们说:在 ltrim 开始之后和 ltrim 完成之前的一毫秒,另一个线程正在将项目推送到列表中:

rpush list 6
rpush list 7

当 2 个 rpush 和 ltrim 都完成后,结果列表是否会由 [5, 6, 7] 组成?

可能只是 [5] 吗?换句话说,是否存在竞争条件,其中 ltrim 会使用 [5] 创建一个临时列表,并在 2 次 rpush 完成后用 [5] 覆盖 [5,6,7]?

【问题讨论】:

    标签: redis


    【解决方案1】:

    简答:不,因为命令是原子的。

    诚实的回答:我不这么认为,因为我认为操作是原子的;但是,该网站没有明确声明它们是原子的,所以我只有 99.99999999% 的把握。

    逻辑答案: Redis 是单线程的,因此没有其他线程可以抢占 ltrim 命令。对于在单线程应用程序中发生的竞态条件,它必须在完成之前显式跳出 ltrim 操作并开始执行其他操作,这没有多大意义。

    【讨论】:

      猜你喜欢
      • 2015-01-30
      • 2013-04-13
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多