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