數據庫主從不一致解決方案:
方案一:忽略--如果業務能夠接受,別把系統架構搞得太復雜
方案二:強制讀主--使用一個高可用主庫提供數據庫服務--過於粗暴
方案三:選擇性讀主--寫主庫時將哪個庫,哪個表,哪個主鍵三個信息拼裝一個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隊列排序 讀請求循環判斷是否已經更新