數據庫|緩存一致性總結


數據庫主從不一致解決方案:

方案一:忽略--如果業務能夠接受,別把系統架構搞得太復雜

方案二:強制讀主--使用一個高可用主庫提供數據庫服務--過於粗暴

方案三:選擇性讀主--寫主庫時將哪個庫,哪個表,哪個主鍵三個信息拼裝一個key設置到cache里,這條記錄的超時時間,設置為“主從同步時延(比如1s)”,然后讀的時候先判斷cache有沒有,有則讀主庫,否則讀從庫

ref:數據庫主從不一致,怎么解?

數據庫|緩存一致性解決方案:

Cache Aside Pattern:

查詢:cache-》如果沒有則查詢數據庫 -》放回cache

更新:更新數據庫-》刪除緩存
(其實刪除緩存,而不是更新緩存,就是一個 lazy 計算的思想,不要每次都重新做復雜的計算,不管它會不會用到,而是讓它到需要被使用的時候再重新計算。像 mybatis,hibernate,都有懶加載思想)

1.防止讀寫並發導致數據庫和緩存不一致的情況(線程1更新db為x-》線程2更新db為y-》線程2更新緩存為y-線程1更新緩存為y===》db和緩存不一致)

2.在復雜點的緩存場景,緩存不單單是數據庫中直接取出來的值。比如可能更新了某個表的一個字段,然后其對應的緩存,是需要查詢另外兩個表的數據並進行運算,才能計算出緩存最新的值的。

PS:特殊情況下:讀寫並發則不可行(線程1讀緩存(miss)=》線程1讀數據庫=>線程2寫數據庫=》線程2使緩存失效=》線程1放入老數據庫的數據) 不過概率極低,寫db比讀要慢

但如果刪除緩存失敗就會導致數據庫和緩存不一致了==>(http://www.jintiankansha.me/t/jmm4fB2a8S)
(http://www.jintiankansha.me/t/0bKZVSdist)

  • 延時雙刪(刪緩存|刪數據庫|睡眠|再刪)
  • 訂閱mysql binlog更新緩存數據
  • 更新請求放入JVM隊列排序 讀請求循環判斷是否已經更新


免責聲明!

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



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