不一致情況 | 圖示 | 說明 |
Key續期失敗 | | 在t1時刻,子執行個體 A 和 B都持有帶到期時間的Key,該Key將於t3時刻到期。 在t2時刻,子執行個體A執行PEXPIREAT命令將該Key續期至t5時刻。 在t3時刻,由於網路延遲等原因,子執行個體B尚未收到來自子執行個體A的PEXPIREAT同步命令,此時子執行個體B中的Key因到期被刪除。 在t4時刻,子執行個體B收到該Key的續期命令,但Key已被到期刪除,故續期命令執行失敗。此時,子執行個體A仍持有Key,子執行個體B中的Key已丟失。
|
因到期時間導致命令執行結果不一致 | | 以SMOVE命令為例。 在t1時刻,子執行個體A和B均持有Key1(將於t3時刻到期)、Key2(未設定到期時間)。 在t2時刻,子執行個體A執行SMOVE Key1 Key2 "foo" 命令,將"foo"成員移動至Key2中。 在t3時刻,由於網路延遲等原因,子執行個體B尚未收到來自子執行個體A的同步命令。同時,子執行個體A和B中的Key1因到期被刪除。 在t4時刻,子執行個體B收到SMOVE命令,但由於Key1已被到期刪除,SMOVE命令執行失敗。此時子執行個體A中的Key2包含“foo”成員,但子執行個體B中的Key2不包含“foo”成員。
|
資料隨機逐出 | | 在t1時刻,子執行個體A和B均持有Key1、Key2。 在t2時刻,子執行個體A記憶體佔滿,觸發資料逐出,隨機刪除Key2。 在t3時刻,子執行個體B記憶體佔滿,觸發資料逐出,隨機刪除Key1。
由於預設資料逐出策略是volatile-lru,且資料逐出的刪除操作不會同步,因此子執行個體A和B資料不一致。 |
多寫-Value互換 | | 多個子執行個體同時對同一個Key進行寫操作,可能導致資料不一致。 在t1時刻,子執行個體A寫入Key:ValA 。 在t2時刻,子執行個體B寫入Key:ValB 。 在t3時刻,子執行個體A向子執行個體B同步資料(Key:valA ),同時子執行個體B向子執行個體A同步資料(Key:valB )。 兩個子執行個體中Key對應的值發生了互換。
|
多寫-資料類型衝突 | | 在t1時刻,子執行個體A寫入Key ,為Hash資料類型。 在t2時刻,子執行個體B寫入Key ,為String資料類型。 在t3時刻同步命令時,會因資料類型衝突而導致失敗。
|
多寫-寫入條件不滿足 | | 在t1時刻,子執行個體A寫入SETNX Key ValA 。 在t2時刻,子執行個體B寫入SETNX Key ValB 。 在t3時刻同步命令時,會因不滿足寫入條件而導致同步失敗。
說明 HSETNX、SET[NX | XX]等命令也會造成類似問題。 |
多寫-亂序或丟失 | | 在t1時刻,子執行個體A寫入RPUSH Key valA 。 在t2時刻,子執行個體B寫入RPUSH Key valB 。 在t3時刻同步命令時,會導致資料亂序或丟失。
說明 LPUSH、APPEND、DEL、HDEL、INCR、XADD等系列命令也會造成類似問題。 |