Redis'ltrim和rpush是否存在可能的竞争条件?
例如,假设我的redis列表包含以下项目: [1,2,3,4,5]
我致电ltrim list 4 -1
这基本上应该将列表切片为[5]
但是让我们说:在ltrim启动后和ltrim完成之前的一毫秒,另一个线程正在将项目推送到列表中:
rpush list 6
rpush list 7
当两个rpushes和ltrims都完成时,结果列表是否包含[5,6,7]?
可能只是[5]吗?换句话说,是否存在竞争条件的可能性,其中ltrim执行类似于创建[5]的临时列表,并在完成2次rpushes后用[5]覆盖[5,6,7]?答案 0 :(得分:4)
简答:不,因为命令是原子的。
诚实的回答:我不这么认为,因为我认为操作是原子的;但是,该网站没有明确说明它们是原子的,所以我只有99.99999999%确定它们是。
逻辑答案: Redis是单线程的,因此没有其他线程可以抢占ltrim命令。对于在单线程应用程序中发生的竞争条件,它必须在完成之前显式跳出ltrim操作并开始执行其他操作,这没有多大意义。