系統架構設計實戰:緩存失效策略選型
緩存失效是從緩存中移除或更新過時數據的過程,以確保僅存儲最新、最準確的信息。緩存通過臨時在內存中存儲頻繁訪問的數據,提高了應用程序的性能,減少了從較慢的存儲系統中獲取數據的需求。然而,當原始數據發生變化時,必須更新或使緩存失效,以保持數據的一致性。
1、緩存失效策略
存在幾種緩存失效策略,每種策略都有其優缺點:
透寫緩存
在這種機制下,數據同時寫入緩存和相應的數據庫。緩存的數據可以快速獲取,由于相同的數據同時寫入永久存儲,我們可以在緩存和存儲間保持完全的數據一致性。此外,這種機制確保在系統崩潰、電力故障或其他系統中斷時不會丟失任何數據。雖然透寫最小化了數據丟失的風險,但由于每個寫操作都必須在返回給客戶端成功之前執行兩次,因此這種機制的缺點是寫操作的延遲較高。
示例:電商網站實時更新其產品庫存。每當產品的庫存變化時,緩存也會更新以反映新的庫存數量。
繞寫緩存
這種技術與透寫緩存類似,但數據直接寫入永久存儲,繞過緩存。這可以減少緩存被寫操作淹沒的情況,這些寫操作隨后可能不會再被讀取,但缺點是對最近寫入的數據的讀請求會產生“緩存未命中”,必須從較慢的后端存儲中讀取,因而會經歷更高的延遲。
示例:一個應用程序更新用戶配置信息,這些信息被訪問的頻率不高。應用程序將新數據直接寫入數據存儲,避免了不必要的緩存更新。
回寫緩存(或稱為懶惰寫入)
在這種方案中,數據只寫入緩存,并立即向客戶端確認完成。根據某些條件(例如,系統需要一些空閑空間時),再將數據寫入永久存儲。這種方式帶來了低延遲和高吞吐量,非常適用于寫入密集型應用程序;然而,這種速度也帶來了在系統崩潰或其他不利事件發生時的數據丟失風險,因為寫入的數據的唯一副本只存在于緩存中。
示例:設想一個協作文檔編輯應用程序,該應用程序允許多個用戶同時對一個文檔進行修改。當用戶進行更改時,這些更改首先保存到緩存,使應用程序能快速響應并提供流暢的編輯體驗。當滿足某些條件(例如,更改數量達到一定閾值)時,應用程序將緩存的更改寫回到數據存儲,用所有用戶的最新更改更新文檔。這種方法最小化了對數據存儲的寫入操作次數,減輕了存儲系統的負擔,提高了應用程序的整體性能。
后寫緩存
它與回寫緩存非常相似。在這種方案中,數據被寫入緩存并立即向應用程序確認,但并不立即寫入永久存儲。相反,寫操作被推遲,數據最終在稍后的時間被寫入永久存儲。回寫緩存和后寫緩存的主要區別在于數據寫入永久存儲的時間。在回寫緩存中,只有在緩存需要釋放空間或發生某個事件時,數據才會被寫入永久存儲。而在后寫緩存中,數據會在指定的時間間隔被寫入永久存儲。
示例:文檔編輯應用程序在用戶編輯時將更改臨時保存到緩存。周期性地,將更改寫回到數據存儲,以減少寫入操作的數量。
2、緩存失效方法
以下是一些著名的緩存失效方法:
清除
清除方法會移除特定對象、URL或一組URL的緩存內容。當內容有更新或變化,并且緩存版本已不再有效時,通常會使用這種方法。收到清除請求后,緩存內容會立即被移除,下一次對內容的請求將直接從源服務器獲取。
示例:新聞網站在對特定文章進行了重大更新后,會從其緩存中清除該文章,確保用戶獲得的是最新版本。
刷新
刷新方法會從源服務器獲取請求的內容,即使有可用的緩存版本。當收到刷新請求時,緩存將用來自源服務器的最新版本更新內容,以確保信息的準確性。不同于清除,刷新請求并不移除已存在的緩存內容,而是將其更新為最新版本。
示例:當電商網站有新的促銷活動時,會刷新產品頁面的緩存,以顯示更新后的價格信息。
Ban
Ban方法根據特定的條件(如URL模式或頭部信息)使緩存內容失效。收到封禁請求后,任何符合指定條件的緩存內容將被立即移除。后續的內容請求將直接從源服務器獲取,以確保用戶收到最新且相關的信息。
示例:當某個標簽被修改時,內容管理系統會封禁所有帶有該特定標簽的緩存內容,確保用戶只看到更新過的內容。
生存時間(TTL)過期
此方法涉及為緩存內容設置一個生存時間,過了這個時間,內容就被認為是過期的,必須進行刷新。當收到內容請求時,緩存檢查生存時間,如果該值尚未過期,就提供緩存的內容。如果該值已過期,緩存就會從源服務器獲取內容的最新版本并將其緩存。
示例:天氣網站為其天氣預報數據設置1小時的生存時間,以確保用戶收到相對最新的天氣信息,同時不會對源服務器造成過大負擔。
舊數據再驗證
此方法在網頁瀏覽器和CDN中被用來在背景更新內容時提供舊的緩存內容。當收到某個內容的請求時,立即將緩存版本提供給用戶,并向源服務器發送異步請求以獲取內容的最新版本。一旦最新版本可用,就更新緩存版本。這種方法確保用戶總是可以快速獲取內容,即使緩存版本略有過時。
示例:媒體流平臺使用舊數據再驗證方法提供視頻縮略圖,確保用戶可以快速瀏覽目錄,同時平臺在后臺更新縮略圖圖像。
結論
緩存失效策略應謹慎選擇,以平衡性能和數據準確性之間的權衡。通過理解不同的緩存失效策略,軟件工程師可以選擇適當的策略來優化緩存性能,降低延遲,同時確保存儲在緩存中的數據準確且最新。