這樣的問題主要是在并發讀寫訪問的時候,緩存和數據相互交叉執行。

一、單庫情況下

同一時刻發生了并發讀寫請求,例如為A(寫) B (讀)2個請求

 

1. A請求發送一個寫操作到服務端,第一步會淘汰cache,然后因為各種原因卡主了,不在執行后面業務 (例:大量的業務操作、調用其他服務處理消耗了1s)。

2. B請求發送一個讀操作,讀cache,因為cache淘汰,所以為空

3. B請求繼續讀DB,讀出一個臟數據,并寫入cache

4. A請求終于執行完全,在寫入數據到DB

總結:因最后才把寫操作數據入DB,并沒同步。cache里面一直保持臟數據

臟數據是指源系統中的數據不在給定的范圍內或對于實際業務毫無意義,或是數據格式非法,以及在源 系統中存在不規范的編碼和含糊的業務邏輯。

 

二、主從同步,讀寫分離的情況下,讀從庫而產生臟數據

 

1. A請求發送一個寫操作到服務端,第一步會淘汰cache

2. A請求寫主數據庫,寫了最新的數據。

3. B請求發送一個讀操作,讀cache,因為cache淘汰,所以為空

4. B請求繼續讀DB,讀的是從庫,此時主從同步還沒同步成功。讀出臟數據,然后臟數據入cache

5. 最后數據庫主從同步完成

 

總結:這種情況下請求A和請求B操作時序沒問題,是主從同步的時延問題(假設1s),導致讀請求讀取從 庫讀到臟數據導致的數據不一致

根本原因:

單庫下,邏輯處理中消耗1s,可能讀到舊數據入緩存

主從+讀寫分離,在1s的主從同步時延中,到從庫的舊數據入緩存