0
關於RPUSH
和LPUSH
上redis.io的文檔不清楚這些操作是否仍然是O(1),並且在推送多個項目時是跨轉換的。例如,如果兩個客戶端執行RPUSH
到多個項目的同一個列表,他們的項目是否可能散佈並因此失序?他的回答在Redis競賽中可以RPUSH和LPUSH嗎?
tadman的評論清除這件事對我最好的:Can RPUSH and LPUSH in Redis race?
關於RPUSH
和LPUSH
上redis.io的文檔不清楚這些操作是否仍然是O(1),並且在推送多個項目時是跨轉換的。例如,如果兩個客戶端執行RPUSH
到多個項目的同一個列表,他們的項目是否可能散佈並因此失序?他的回答在Redis競賽中可以RPUSH和LPUSH嗎?
tadman的評論清除這件事對我最好的:Can RPUSH and LPUSH in Redis race?
由於Redis的是單線程的,還有作爲他們的「同時」發生這樣的事情,一個總是會到來的未來其他,但時機往往無法控制。
現在,如果您有兩個進程可以以某種方式進行協調,那麼您可以讓一個進程順從其他進程,直到該操作完成。如果您擔心這一點,您可以創建某種悲觀鎖定,儘管這只是一個解決方案。
所以簡短的回答是,他們會按隨機順序到達。
這就是爲什麼Redis實施MULTI
命令來批量處理事務。這些交易將以原子方式應用。
因此,每個命令將以隨機順序到達,這意味着您不能保證RPUSH'a'發生在RPUSH'b'之前,但Redis的單線程設計確保'a'項不與項目交錯'b'?也就是說,結果是「ab」或「ba」,但不是「a」和「b」項的合併? – sabrehagen
是的,兩個操作直接衝突基本上是不可能的,但這是大多數數據庫的工作原理。不要忘記你可以'RPUSH'多個項目,一個命令是自動應用的,只有多個命令纔會散佈,並且只有當它們沒有封裝在'MULTI'語句中。 – tadman