緩存在現代應用程序中被廣泛使用,用於提高性能和降低對後端數據存儲系統的負載。然而,使用緩存也帶來了一個重要問題:緩存一致性。在分佈式系統中,緩存一致性成爲了一個挑戰,因爲我們需要確保緩存中的數據與後端數據存儲系統的數據保持同步,以避免數據不一致的情況發生。
Cache Aside Pattern(先寫庫再刪緩存)
Cache Aside Pattern 是一種常見的緩存設計模式,用於在應用程序中有效地利用緩存來提高性能和降低對後端數據存儲系統的負載。該模式的核心思想是將緩存視爲數據檢索的副本,並在需要訪問數據時先查詢緩存。如果緩存中存在所需數據,則直接從緩存中獲取;如果緩存中不存在所需數據,則從後端數據存儲系統(如數據庫)中獲取,並將數據添加到緩存中以供下次使用。
讀取數據時:
- 應用程序首先查詢緩存,檢查所需數據是否已經存在於緩存中。
- 如果緩存中存在數據,則直接返回緩存中的數據。
- 如果緩存中不存在數據,則從後端數據存儲系統中獲取數據,並將數據添加到緩存中,以便下次訪問時能夠直接從緩存中獲取。
寫入/更新數據時:
- 應用程序首先更新後端數據存儲系統中的數據。
- 然後,應用程序使緩存中與被更新數據相關的緩存項失效,以保持緩存中的數據與後端數據存儲系統的一致性。
更新緩存時,不使用更新,而是刪除
刪除緩存:在數據更新完成後,即刻刪除對應的緩存項。這樣做是爲了確保下一次使用該數據時,會從後端數據存儲系統讀取最新的數據而不是過期的緩存值。
爲什麼不可以先更新緩存,再更新庫
併發操作導致數據不一致:假設有多個同時請求需要修改同一個數據項,如果先刪除緩存再寫數據庫,可能會導致併發操作之間的數據不一致。這是因爲在刪除緩存的時間窗口內,其他請求可能會讀取到舊的緩存值,而不是最新的數據庫值。
應該先更新庫,再更新緩存
就算先更新庫,再更新緩存,還是會有極端情況出現導致不一致
解決方案,延遲雙刪
最後總結
- 要保證緩存與數據庫強一致,最好的辦法是分佈式鎖,但那樣併發性能就完蛋。
- Cache Aside Pattern + 延遲雙刪無鎖方案只能在保證併發的前提下儘可能減少不一致的可能。