快取讀寫策略 – 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 策略也是不保證數據一致性的,它的作用是大大減少不一致性。

某些極端情況還是存在不一致,如果業務上不允許,可以考慮加分散式鎖。