6 種常見的緩存策略,請享用!
緩存(Cache)策略在計算機系統中起着至關重要的作用,它們決定了數據如何在存儲層次結構中流動和被管理,緩存策略的選擇可以顯著影響系統的性能、可靠性和複雜性。這篇文章,我們來分析 6 種常見的緩存策略:
-
Read Through(讀取穿透)
-
Cache Aside(緩存旁路)
-
Write Through(直寫)
-
Write Around(繞過緩存寫)
-
Write Back(回寫)
-
Refresh-ahead(預刷新)
Read Through
Read Through 緩存策略是一種同步讀取策略,在這種策略中,當應用程序需要讀取數據時,首先查詢緩存,如果緩存中沒有所需的數據(即緩存未命中),緩存系統會自動從底層數據存儲(如數據庫)中讀取數據,並將其存入緩存中,然後返回給應用程序。其模型如下圖:
優點:
-
簡化應用邏輯:應用程序不需要處理緩存未命中的情況,緩存系統自動處理數據加載。
-
數據一致性:由於緩存系統直接從數據源讀取數據,確保了緩存中的數據是最新的。
缺點:
-
初次訪問延遲:如果緩存未命中,讀取操作會有一定的延遲,因爲需要從底層存儲中獲取數據。
-
緩存填充開銷:每次緩存未命中時,都會導致底層存儲的訪問,這可能會增加系統的負載。
適用場景:
-
適用於讀操作頻繁且讀一致性要求較高的場景。
-
在數據更新頻率較低的情況下,Read Through 可以有效減少應用程序的複雜性。
Cache Aside
Cache Aside(也稱爲 Lazy Loading 或 Lazy Caching)策略要求應用程序顯式地管理緩存。應用程序首先檢查緩存,如果未命中,則從底層數據存儲中讀取數據,並將其放入緩存中供下次使用。其模型如下圖:
優點:
-
靈活性高:應用程序可以根據具體需求決定何時加載和更新緩存。
-
緩存命中率高:由於應用程序負責緩存管理,可以更好地優化緩存使用。
缺點:
-
複雜性增加:應用程序需要處理緩存未命中的邏輯以及緩存的更新和失效。
-
潛在的數據不一致性:如果數據更新後未及時刷新緩存,可能會導致不一致的數據。
適用場景:
-
適用於讀多寫少且對讀性能要求高的場景。
-
應用程序可以容忍一定程度的數據不一致性。
Write Through
Write Through 策略是一種同步寫入策略,當應用程序對數據進行更新時,數據會同時寫入緩存和底層數據存儲,這確保了緩存和數據存儲的一致性。其模型如下圖:
優點:
-
數據一致性強:由於每次寫操作都會更新緩存和數據存儲,因此可以保證它們之間的數據一致性。
-
簡單的實現:不需要複雜的緩存失效機制。
缺點:
-
寫操作延遲:每次寫操作都需要更新底層存儲,這可能導致寫操作的延遲增加。
-
寫入開銷大:頻繁的寫操作可能會導致底層存儲的負載增加。
適用場景:
-
適用於數據一致性要求高且寫操作相對較少的場景。
-
在需要確保每次寫入操作後的數據一致性時,Write Through 是一種有效的策略。
Write Around
Write Around 策略是一種變體的寫入策略,當數據被更新時,僅更新底層數據存儲,而不更新緩存,緩存的數據只有在被讀取時纔會更新。其模型如下圖:
優點:
-
降低寫入延遲:避免了每次寫操作都更新緩存,從而降低了寫入延遲。
-
減輕緩存壓力:寫操作不會直接影響緩存,可以減少緩存的更新頻率。
缺點:
-
緩存未命中率高:由於寫入操作不更新緩存,可能導致後續讀取操作未命中緩存。
-
潛在的數據不一致性:如果緩存中的數據在更新後沒有及時刷新,可能會導致數據不一致。
適用場景:
-
適用於寫操作頻繁且讀操作可以容忍一定延遲的場景。
-
在需要減少寫操作對緩存影響的情況下,Write Around 是一種可行的策略。
Write Back
Write Back 策略是一種異步寫入策略,當應用程序更新數據時,僅更新緩存,緩存中的數據會在一段時間後(或滿足特定條件時)批量寫入底層數據存儲。其模型如下圖:
優點:
-
寫操作延遲低:由於寫操作僅更新緩存,寫入延遲較低。
-
提高系統吞吐量:批量寫入可以減少對底層存儲的訪問次數,提高系統的整體吞吐量。
缺點:
-
數據一致性風險:由於底層存儲更新滯後,可能導致數據不一致。
-
數據丟失風險:如果緩存數據在寫入底層存儲之前丟失(例如系統故障),可能導致數據丟失。
適用場景:
-
適用於寫操作頻繁且對寫入性能要求高的場景。
-
在可以接受一定程度的數據延遲和不一致性的情況下,Write Back 是一種高效的策略。
Refresh-ahead
Refresh-ahead 是一種緩存預取策略,旨在提高系統的響應速度,尤其是在可預測的訪問場景下,與其他緩存策略的被動性不同,refresh-ahead 通過主動預測未來可能會被訪問的數據,提前從主存儲載入緩存中,從而減少未來請求時的緩存未命中率(Cache Miss)。其模型如下圖:
優點:
-
減小讀取延遲:通過提前加載數據降低未來請求的響應時間,特別是減少了緩存未命中的概率。
-
提升性能:由於數據被提前載入,系統在實際請求到達時能立即提供服務,減少瓶頸。
缺點:
-
資源浪費:如果預測不準確,預載入的數據可能根本不會被訪問,這將導致內存和 IO 資源的浪費。
-
處理複雜性增加:需要進行訪問模式的監控與分析,對系統增加了額外的複雜度。
使用場景:
-
時間序列數據:例如股票行情、傳感器讀數等具有強時間依賴或者逐步遞增的數據流場景,這類數據的訪問頻率和順序可以被良好預測。
-
順序讀取:如果系統知道存在將要順序訪問的數據塊,可以提前將數據加載到緩存。
-
高延遲系統:例如大規模分佈式系統或移動網絡應用,提前刷新可以減少等待時間和網絡延遲。
綜合分析
在選擇緩存策略時,需要根據具體的應用場景和需求進行權衡,以下是一些日常開發中經常需要考慮的因素:
-
數據一致性:如果數據一致性是首要考慮因素,Write Through 和 Read Through 是較好的選擇。
-
性能要求:如果系統對性能要求較高,尤其是寫入性能,Write Back 策略可能更適合。
-
複雜性與靈活性:Cache Aside 提供了更大的靈活性,但也增加了應用程序的複雜性。
-
延遲與吞吐量:Write Around 可以減少寫入延遲,而 Write Back 可以提高系統的吞吐量。
-
可預測性:如果系統可預測性較強,Write Around 可以減少寫入延遲,而 Write Back 可以提高系統的吞吐量。
總結
本文,我們分析了 6 種常見的緩存策略,也是在我們日常開發中經常使用的策略,關於緩存策略的選擇應根據具體的應用需求、系統架構以及性能目標進行評估和優化。在實際應用中,我們可能只使用其中的某一種,也可以需要結合多種策略,最終如何選擇,需要根據實際業務情況而定,最後我們再回顧下 6 種策略:
-
Read Through:在緩存缺失時從主存取數據並更新緩存,適合讀多寫少場景。
-
Cache Aside:由應用程序自己管理緩存,提供靈活性,適合複雜業務邏輯。
-
Write Through:實時在緩存和主存同步寫數據,保證一致性但寫入稍慢。
-
Write Around:寫操作跳過緩存,減少寫入負擔,適合寫頻繁但讀取少的情況。
-
Write Back:先寫緩存,後續批量寫入主存,提升寫性能,但最終一致性難以保證。選擇應根據性能需求和一致性要求平衡。
-
Refresh-ahead:預先載入未來可能會被訪問的數據,減少未來請求的響應時間,適合在可預測的訪問場景下。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/ilRpviACZlxdfTLTx-pZBA