緩存和資料庫的交互
來自專欄 Java之鏈
一 緩存基礎
緩存是最常用最有效的系統優化技術,這種技術無處不在。
緩存中存放的數據最常見的兩種來源:1)本地硬碟;2)遠程系統中的數據
緩存適用於讀多寫少的情況。衡量緩存指標有緩存命中hit和緩存未命中miss。
二 緩存臟數據怎麼辦?
緩存經常和資料庫配合使用,把資料庫中的數據放在緩存里,加快了讀取的速度。
那麼問題來了:如果資料庫中的數據發生變化,怎麼處理緩存中的數據呢?
有三種方案:
1:緩存中數據不做處理。這樣會造成數據的不一致問題。
2:更新緩存中的數據。用正確的數據代替錯誤的數據,保證了命中率。
3:淘汰緩存中的數據。簡單方便,但會造成一次miss。
分析:方案1行不通。方案2和3要看具體的業務場景,如果獲得正確的數據比較複雜(比如經過較多的計算),那麼方案2就不太適合,這時候應該選擇方案3。方案3可作為一種通用方案,方案2更適合更新緩存的複雜度更小的場景。
比較方案的原則是:兩害相權取其輕。看誰對業務和系統影響更小。
三 緩存和資料庫的操作順序
處理緩存和處理資料庫是兩個動作,這不是一個原子操作。非原子操作要考慮先後順序問題:淘汰緩存和更新資料庫,哪個在前?哪個在後?
還是老套路,解決一個問題,提出N個方案,經過分析和比較,選擇合適的方案。
方案1:先更新資料庫,再淘汰緩存。
方案2:先淘汰緩存,後更新資料庫。
在方案1中,假設淘汰緩存失敗,那麼db和cache數據不一致,程序會讀到臟數據。
在方案2中,假設更新資料庫失敗,只會造成一次miss。
以上分析方法是假設失敗,看系統的穩定性。
所以,正確的策略應該是先淘汰緩存,後更新資料庫。
參考文獻:緩存架構設計細節二三事
推薦閱讀:
※CPU體系結構-Cache
※CPU cache
※緩存世界中的三大問題及解決方案
※高性能 Web 緩存伺服器 nuster 1.7.9.6 發布
※V8 6.6 進一步改進緩存性能
TAG:緩存 |