快取讀寫策略 – Cache Aside
- 2019 年 12 月 25 日
- 筆記
場景描述
比如一條數據同時存在資料庫、快取,現在你要更新此數據,你會怎麼更新?
先更新資料庫?還是先更新快取?
其實這兩種方式都有問題。
(1)先更新資料庫,後更新快取

這樣會造成數據不一致。

A 先把資料庫更新為 123,由於網路問題,更新快取的動作慢了。
這時,B 去更新資料庫了,改為了 456,緊接著把快取也更新為 456。
現在 A 更新快取的請求到了,把快取更新為了 123。
那麼這時數據就不一致了,資料庫里是最新的 456,而快取是 123,是舊數據。
因為資料庫更新、快取更新這2個動作不是原子的,在高並發操作時,這2個動作直接會插入其他動作。
(2)先更新快取,再更新資料庫

同樣可能數據不一致。

快取更新成功,數據為最新的,但資料庫更新失敗,回滾了,還是舊數據。
還是非原子操作的原因。
Cache Aside 策略
其實,在更新數據時,我們可以不更新快取,而是刪除快取中的數據,在讀取數據時,發現快取中沒有,再從資料庫中讀取數據,更新到快取中。
這就是 Cache Aside 策略(旁路快取策略)。
- 讀策略步驟

- 寫策略步驟

寫時可以不可以先刪除快取?不行!
例如這個場景:

A 先刪了快取,還沒等資料庫更新完成呢,就被 B 把快取更新為了舊值。
- 注意
Cache Aside 策略也是不保證數據一致性的,它的作用是大大減少不一致性。
某些極端情況還是存在不一致,如果業務上不允許,可以考慮加分散式鎖。