標籤:

緩存和資料庫的交互

緩存和資料庫的交互

來自專欄 Java之鏈

一 緩存基礎

緩存是最常用最有效的系統優化技術,這種技術無處不在。

緩存中存放的數據最常見的兩種來源:1)本地硬碟;2)遠程系統中的數據

緩存適用於讀多寫少的情況。衡量緩存指標有緩存命中hit和緩存未命中miss。

二 緩存臟數據怎麼辦?

緩存經常和資料庫配合使用,把資料庫中的數據放在緩存里,加快了讀取的速度。

那麼問題來了:如果資料庫中的數據發生變化,怎麼處理緩存中的數據呢?

有三種方案:

1:緩存中數據不做處理。這樣會造成數據的不一致問題。

2:更新緩存中的數據。用正確的數據代替錯誤的數據,保證了命中率。

3:淘汰緩存中的數據。簡單方便,但會造成一次miss。

分析:方案1行不通。方案2和3要看具體的業務場景,如果獲得正確的數據比較複雜(比如經過較多的計算),那麼方案2就不太適合,這時候應該選擇方案3。方案3可作為一種通用方案,方案2更適合更新緩存的複雜度更小的場景。

比較方案的原則是:兩害相權取其輕。看誰對業務和系統影響更小。

三 緩存和資料庫的操作順序

處理緩存和處理資料庫是兩個動作,這不是一個原子操作。非原子操作要考慮先後順序問題:淘汰緩存和更新資料庫,哪個在前?哪個在後?

還是老套路,解決一個問題,提出N個方案,經過分析和比較,選擇合適的方案。

方案1:先更新資料庫,再淘汰緩存。

方案2:先淘汰緩存,後更新資料庫。

方案1

在方案1中,假設淘汰緩存失敗,那麼db和cache數據不一致,程序會讀到臟數據。

方案2

在方案2中,假設更新資料庫失敗,只會造成一次miss。

以上分析方法是假設失敗,看系統的穩定性。

所以,正確的策略應該是先淘汰緩存,後更新資料庫

參考文獻:緩存架構設計細節二三事


推薦閱讀:

CPU體系結構-Cache
CPU cache
緩存世界中的三大問題及解決方案
高性能 Web 緩存伺服器 nuster 1.7.9.6 發布
V8 6.6 進一步改進緩存性能

TAG:緩存 |