0

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]?

4

1 回答 1

4

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

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

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

于 2013-05-13T00:00:31.387 回答