怎么保證緩存和數據庫數據的一致性?


淘汰緩存還是更新緩存? 

選擇淘汰緩存

原因:數據可能為簡單數據,也可能為較復雜的數據,復雜數據進行緩存的更新操作,成本較高,因此一般推薦淘汰緩存

先淘汰緩存還是先更新數據庫?

選擇先淘汰緩存,再更新數據庫

原因:假如先更新數據庫,再淘汰緩存,假如緩存淘汰失敗,那么后面的請求都會得到臟數據,直至緩存過期。假如先淘汰緩存再更新數據庫,如果數據庫更新失敗,只會產生一次緩存miss,相比較而言,后者對業務影響更小一點。

延時雙刪策略

如下場景:同時有一個請求A進行更新操作,另一個請求B進行查詢操作。
(1)請求A進行寫操作,刪除緩存
(2)請求B查詢發現緩存不存在
(3)請求B去數據庫查詢得到舊值
(4)請求B將舊值寫入緩存
(5)請求A將新值寫入數據庫

次數便出現了數據不一致問題。采用延時雙刪策略得以解決

public void write(String key,Object data){
    redisUtils.del(key);
    db.update(data);
    Thread.Sleep(100);
    redisUtils.del(key);
}

這么做,可以將1秒內所造成的緩存臟數據,再次刪除。這個時間設定可根據俄業務場景進行一個調節。

數據庫讀寫分離的場景

兩個請求,一個請求A進行更新操作,另一個請求B進行查詢操作。

(1)請求A進行寫操作,刪除緩存
(2)請求A將數據寫入數據庫了,
(3)請求B查詢緩存發現,緩存沒有值
(4)請求B去從庫查詢,這時,還沒有完成主從同步,因此查詢到的是舊值
(5)請求B將舊值寫入緩存
(6)數據庫完成主從同步,從庫變為新值

依舊采用延時雙刪策略解決此問題

參考鏈接:Redis緩存和數據庫一致性問題

                   緩存與數據庫一致性之一:緩存更新設計


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM