策略1: Read/Write Through
緩存策略
讀請求處理策略
- 緩存命中,直接返回緩存數據;
- 緩存未命中,從數據庫加載數據,更新緩存;
寫請求處理策略
- 先更新數據庫,然後更新緩存;
數據不一致情況
- 情況1: 讀請求處理期間,併發的寫請求更新數據,導致緩存最終數據爲舊數據;(無法實現最終一致性,實際情況發生的概率極低)
- 情況2: 寫請求1處理期間,併發的寫請求2更新數據,導致緩存最終數據爲舊數據;(無法實現最終一致性,併發情況下發生概率較高)
策略2: Cache Aside(推薦)
緩存策略
讀請求處理策略
- 緩存命中,直接返回緩存數據;
- 緩存未命中,從數據庫加載數據,更新緩存;
寫請求處理策略
- 先更新數據庫,然後刪除緩存;
數據不一致情況
- 情況1: 寫請求處理期間,併發的讀請求讀取到舊數據,寫完成後緩存更新到最新數據;(最終一致性)
- 情況2: 讀請求處理期間,併發的寫請求更新數據,導致緩存最終數據爲舊數據;(無法實現最終一致性,實際情況中發生的概率極低,因爲需要讀請求的處理時間大於寫請求處理時間,並且緩存失效,正常情況寫請求處理時間大於讀請求)
Read/Write Through VS Cache Aside
高併發情況下,Read/Write Through策略發生數據不一致的概率高,而Cache Aside策略極大的降低了併發時髒數據的概率,因此實際項目中會使用Cache Aside策略,同時爲緩存設置過期時間進行兜底。
參考: