背景
在大部分C端專案中,如果想提升系統併發能力,需要上快取。但是快取的實現方式多種多樣,本文主要穿透實現,直接闡述設計模式上的概念,方便各種實現對號入座。
概念
- SoR(System-of-Record )
記錄系統,這裡指的就是實際資料存放的系統,一般指業務對應的資料庫
分類
1. Cache-aside
-
讀取虛擬碼
點選檢視程式碼
v = cache.get(k) if (v == null) { v = sor.get(k) cache.put(k, v) }
-
寫入虛擬碼
點選檢視程式碼
v = newV sor.put(k, v) cache.put(k, v)
這種模式下,需要應用程式嵌入快取處理的邏輯:
- 在查詢時,判斷快取是否存在記錄,有直接返回;沒有則從SoR中獲取,再更新快取。
- 在寫入時,快取必須和記錄系統一起更新
2. Cache-as-SoR
快取即 SoR 模式: 使用快取和使用記錄系統無差別(無感知)。這種模式下對讀寫場景需要做具體實現:
2.1 讀場景
- Read-through
讀場景下,一般採用Read-through模式,快取中介軟體提供一個loader元件,對應用程式來說只與loader互動,實際底層並不關心實現。
2.2 寫場景
寫場景下,主要描述如何更新快取,有以下兩種選擇
- Write-through
更新資料時,快取中介軟體提供一個write元件,對應用程式來說只需要知道更新了資料。具體邏輯由元件實現,去更新記錄系統,並更新快取 - Write-behind
在更新資料的時候,只更新快取,不更新資料庫,從而提高資料更新的響應速度。快取會非同步地批量更新資料庫,代價就是資料不是強一致的。