2013-05-12 100 views
0

Redis的ltrim和rpush可能存在競爭條件嗎?Redis ltrim - 可能的競爭條件?

例如,假設我Redis的列表中有下列項目: [1,2,3,4,5]

我呼籲ltrim list 4 -1 這基本上應該切片列表只[5]

但是,讓我們說:LTRIM後一毫秒已經開始,LTRIM完成之前,另一個線程正在推動項目名單:

rpush list 6 
rpush list 7 

當兩者是叔他2推,並且ltrims完成,結果列表是由[5,6,7]組成的?

它可能只是[5]?換句話說,是否存在一種競爭條件的可能性,ltrim在[2]中創建了一個臨時列表,並在2次完成之後用[5]覆蓋了[5,6,7]?

回答

4

簡短回答:不,因爲命令是原子的。

誠實的回答:我不這麼認爲,因爲我認爲操作是原子的;然而,網站並沒有明確說明它們是原子的,所以我只確定它們是99.99999999%。

邏輯回答: Redis是單線程的,所以沒有其他線程可以搶佔ltrim命令。對於在單線程應用程序中出現的競態條件,它必須在完成之前明確跳出ltrim操作並開始執行其他操作,這沒有多大意義。