cache與db不一致的原因,讀與寫出現並發。
理論上,給cache設置過期時間,是保證最終一致性到解決方案。這種方案下,寫操作以數據庫為准。更新cache失敗,只要到了過期時間,后面的讀請求會從數據庫中讀取新值存入cache。不過,實際開發中只設過期時間不足以滿足需求,出現3種策略。
- 先更新DB,再更新cache
- 先更新DB,再刪除cache
- 先刪cache,再更新DB
對於第一種策略,開發中遇到比較少,原因如下:
- 如果寫比讀多,讀取數據跟不上cache的頻繁更新,浪費性能
- 如果DB的值需要經過一系列計算寫入cache,每次更新DB,都要計算再寫入cache,浪費性能
后面2種策略,開發中體現以下幾個場景:
- 先更新DB,再刪除cache,刪除cache失敗
- 當刪除完cache的時候,這時去更新DB,但還沒有更新完,另外一個請求來查詢數據,發現cache里沒有,就去DB里查,再把DB舊數據存入緩存中
解決方案:
場景1
- 先刪除cache,再更新DB,如果刪除cache失敗,就不更新DB。重試機制,刪除cache。
場景2
- 利用消息隊列,更新cache
DB產生新的增刪改操作放入隊列中,操作執行完發消息給cache,cache數據進行更新。如果中途出現查詢,同步等待cache更新完成。
詳細資料可以參考:https://www.cnblogs.com/rjzheng/p/9041659.html
通常做法:
寫數據只寫DB
更新數據,先更新DB;讀數據,先讀cache
cache存熱點數據