一致性問題主要包含兩種情況
- 緩存中有數據,那么緩存中的數據需要和數據庫中數據的值相同
- 緩存中本身沒有數據,那么數據中的值必須是最新值
除此之外就是緩存不一致問題了
解決一致性問題首先要根據緩存讀寫模式(讀寫緩存、只讀緩存)來進行分析
讀寫緩存(對緩存進行增刪改)時有兩種方法
- 同步直寫
寫緩存時也同步寫數據庫,緩存和數據庫中的數據一致
- 異步寫回
寫緩存時不同步寫數據庫。如果數據還沒寫回到數據庫緩存發生故障,會造成數據丟失,數據庫中不是 最新數據的情況
只讀緩存
對於只讀緩存來說,如果有數據新增則直接在數據庫中完成,如果有數據刪改則把緩存中的數據標記為無效,再次請求數據時無法從緩存中獲取,就會直接請求數據庫
- 新增數據時,數據會直接寫入到數據庫中,不需要對緩存進行操作,此時緩存中沒有最新值,數據庫中有最新值,所以這時候緩存和數據庫中的數據是一致的
- 刪改數據時
-
- 當刪除數據時
-
- 如果先對緩存中的數據進行了刪除,數據庫中的數據沒有完成刪除,緩存中的數據缺失,然后會請求數據庫,這時候數據庫中的值為舊值,請求到的就是舊值。
- 如果先對數據庫中的值進行刪除,緩存中的數據沒有完成刪除,后續的數據請求就會直接請求到緩存中的數據,仍然存在緩存一致性問題。
在只讀緩存中,如果要保證緩存一致性,我們可以采用重試機制來進行。可以把要刪除的緩存值或者更新的數據值存入到消息隊列中。當沒有成功的刪除緩存值或者數據庫中的值時,可以從消息隊列中重新讀取這些值,然后再進行刪除或者更新。如果成功的進行了刪除或者更新則將這些值從消息隊列中去除避免重復操作。如果嘗試了一定次數,還是沒有成功則向業務層發送報錯信息。