你是否曾想過為什麼在 Spring Boot 應用中緩存是如此重要?答案在於它通過減少數據檢索時間來提高性能。在本文中,我們將深入探討緩存對微服務模式的影響,並探討根據操作易用性、速度、可用性和可觀測性等因素選擇正確緩存的重要性。我們還將探討如何最大程度地提高緩存性能和可用性。 1 緩存實現 1.1 ...
你是否曾想過為什麼在 Spring Boot 應用中緩存是如此重要?答案在於它通過減少數據檢索時間來提高性能。在本文中,我們將深入探討緩存對微服務模式的影響,並探討根據操作易用性、速度、可用性和可觀測性等因素選擇正確緩存的重要性。我們還將探討如何最大程度地提高緩存性能和可用性。
1 緩存實現
1.1 緩存對微服務模式的影響
考慮這樣的情景,其中一個 Edge API 開放給互聯網,觸發對服務 A 和 B 的額外請求,這兩個服務反過來調用服務 C 和 D。通過引入客戶端緩存,可以顯著提高應用程式性能並打破這種依賴鏈。
1.2 選擇正確的緩存
在選擇正確的緩存之前,我們必須瞭解我們應用的需求,並根據以下因素選擇緩存:
- 操作易用性 — 是否需要向系統添加新組件?
- 速度 — 從緩存檢索或設置值需要多長時間?
- 可用性 — 它如何提高系統的整體可用性?
- 可觀測性 — 系統的狀態推理有多容易?
2 緩存類型
有三種不同類型的緩存:
2.1. 本地緩存
- 僅限於應用程式/節點運行的本地實例
- 由於數據存儲在本地,所以速度更快
- 由於數據與其他緩存不共用,缺乏一致性
- 在需要在多個節點之間共用大量數據的情況下效率低
- 用例場景:當數據特定於單個實例且不需要在不同實例之間共用數據時
2.2. 分散式緩存
- 由於緩存在多個實例之間共用,緩存的數據可由系統中的任何節點訪問(用例:多個實例需要共用一個公共緩存)
- 由於網路延遲,從遠程節點訪問數據可能需要一些時間,但並非總是如此
- 由於每個實例將其更改傳播到其他節點,因此一致性
- 可高度擴展
2.3. 分層緩存
- 每個客戶端副本都保留本地緩存和遠程緩存,作為回退
- 這類似於 CPU 緩存
if local_cache_hit(request):
return get_from_local_cache(request)
else:
if remote_cache_hit(request):
return get_from_remote_cache(request)
else:
response = call_a(request)
set_local_cache_in_background(response)
set_remote_cache_in_background(response)
return response
每種緩存的目標都是最大程度地增加緩存命中,以提高系統的整體性能。那麼在實際設置中,當我們有定期更新的動態數據並且還存儲緩存內容以獲得所需輸出時,我們該如何做呢?
可為緩存設置生存時間(TTL)。如果我們為我們的緩存設置長時間的 TTL,比如近 24 小時,我們可能會讀取陳舊的數據,另一方面,較短的 TTL 將增加新鮮度,但經常調用伺服器可能會導致可用性和延遲問題。
我們將討論一些策略,如面向事件驅動架構的主動失效和對於伺服器不發出事件的情況下的後臺刷新。
- 主動失效 → 用於事件驅動架構的最常見用法。每當伺服器發出事件時,客戶端都會監聽它並更新緩存並清除不必要的緩存數據。我們可以設置較長的 TTL,知道過時的條目將被主動失效。
- 後臺刷新 → 如果伺服器不發出事件,我們可以在後臺刷新條目,即使是緩存命中。我們的數據可能會變得不那麼陳舊,而延遲將大大降低。
3 結論
實質上,在 Spring Boot 中進行緩存是提高性能的關鍵。從打破依賴關係到優化命中,它是微服務世界中高效和響應性系統的重要工具。
參考
- [32. Caching - Spring Framework Documentation](
本文由博客一文多發平臺 OpenWrite 發佈!