緩存:系統設計中至關重要的一環
什么是緩存?
緩存就像是一個超快速的存儲區域,保存了計算機或手機經常使用的內容的副本,這樣可以在不訪問較慢的主存儲器的情況下快速獲取。
一個現實中的例子可以是,每當我們購買雜貨時,通常會傾向于大量購買,這樣可以讓雜貨多存放一段時間,避免頻繁去市場購買,這其實就是將雜貨緩存在我們附近,而不是每次都從市場購買。
在系統設計中,如果緩存得當,它可以顯著提升系統的性能。
緩存策略取決于數據訪問模式,即數據是如何讀取或寫入的。例如:
- 系統是讀取密集型還是寫入密集型?
- 系統是否需要高一致性?
等等……
因此,選擇正確的寫入緩存策略非常關鍵,下面是一些不同的緩存策略:
1. 緩存旁路(懶加載)
在這種設置中,應用程序緩存被分離出來,應用程序顯式地與緩存和數據庫一起工作。這是一種技術,應用程序代碼負責管理緩存。當需要時,應用程序會將數據顯式加載到緩存中,而緩存不會主動參與數據獲取。
緩存旁路
該圖示了其工作原理。
使用場景:
適用于讀取密集型系統,Redis 或 Memcached 非常受歡迎,我曾經在緩存旁路設置中使用過 Redis 以及 Mongo-db,效果非常顯著。
這種讀取技術可以與諸如寫入旁路緩存之類的數據寫入技術相結合,我接下來會解釋。
優點:
- 靈活性:允許選擇性緩存特定數據。
- 控制:應用程序控制數據何時加載到緩存中。
缺點:
- 提供過期數據:可能會提供過期數據,但如果我們實現了緩存的TTL(生存時間),則可以避免這種情況。
2. 寫入旁路
跳過緩存,直接將數據寫入數據庫,并在讀取用戶請求的數據時更新緩存。
使用場景:
寫入旁路可以與讀取通過結合,對于數據寫入一次,讀取頻率較低或幾乎不讀取的情況下提供良好的性能,例如實時日志或聊天室消息。同樣,這種模式也可以與緩存旁路結合使用。
3. 讀取穿透緩存
讀取穿透緩存是一種策略,當發生緩存未命中時,緩存會自動從底層數據源檢索數據并填充自身。這種技術與應用程序的數據訪問層無縫集成,確保緩存與數據源保持同步。
讀取穿透緩存
使用場景、優點和缺點:
讀取穿透緩存適用于讀取密集的工作負載,當同一數據被多次請求時。例如,一個新博客。缺點是,當首次請求數據時,總是會導致緩存未命中,并造成額外的數據加載開銷。
4. 寫入穿透緩存
寫入穿透緩存是一種策略,其中寫操作同時應用于緩存和底層數據源。這確保了緩存和數據源保持同步,但與寫入后緩存相比可能會引入額外的延遲。它同步應用更新。
使用場景、優點和缺點:
當與讀取穿透緩存結合時,寫入穿透緩存可以保證每次讀取和寫入的數據一致性。但它會增加寫操作的額外開銷,因為每次寫入都需要兩次寫入操作(緩存和數據庫)。它以異步方式應用更新。
5. 寫入后緩存
寫入后緩存,也稱為寫回緩存,涉及在寫操作發生時延遲對數據源的更新。系統不會立即更新底層存儲,而是首先更新緩存,然后異步將更改傳播到數據源。
使用場景、優點和缺點:
寫回緩存提高了寫入性能,非常適用于寫入密集型任務。當與讀取穿透結合時,適用于混合工作負載,確保最近的數據可用。
總結:
本文探討了緩存技術,強調了根據數據訪問模式選擇正確策略的重要性。了解這些緩存策略對于在不同場景中優化系統性能至關重要。