了解快取抽象概念

快取 vs 緩衝區

術語「緩衝區」和「快取」往往可以互換使用。但是,請注意,它們代表不同的事物。傳統上,緩衝區用作快速實體和慢速實體之間資料的中間臨時儲存。由於一方必須等待另一方(這會影響效能),因此緩衝區透過允許一次移動整個資料區塊而不是小區塊來減輕此問題。資料只從緩衝區寫入和讀取一次。此外,緩衝區至少對意識到它的其中一方可見。

另一方面,根據定義,快取是隱藏的,並且沒有任何一方意識到正在發生快取。它還可以提高效能,但透過讓相同的資料以快速的方式多次讀取來實現。

您可以在此處找到關於緩衝區和快取之間差異的進一步解釋。

快取抽象概念的核心是將快取應用於 Java 方法,從而根據快取中可用的資訊減少執行次數。也就是說,每次調用目標方法時,抽象概念都會應用快取行為,以檢查是否已針對給定的引數調用該方法。如果已調用,則傳回快取結果,而無需調用實際方法。如果尚未調用該方法,則會調用該方法,並快取結果並傳回給使用者,以便下次調用該方法時,傳回快取結果。這樣,昂貴的方法(無論是 CPU 密集型還是 IO 密集型)都可以針對給定的一組參數僅調用一次,並且可以重複使用結果,而無需實際再次調用該方法。快取邏輯以透明方式應用,不會干擾調用者。

此方法僅適用於保證針對給定輸入(或引數)傳回相同輸出(結果)的方法,無論調用多少次。

快取抽象概念提供其他快取相關的操作,例如更新快取內容或移除一個或所有條目的能力。如果快取處理在應用程式執行期間可能會變更的資料,這些操作會很有用。

與 Spring Framework 中的其他服務一樣,快取服務是一種抽象概念(而不是快取實作),並且需要使用實際儲存來儲存快取資料 — 也就是說,抽象概念使您不必編寫快取邏輯,但不提供實際的資料儲存。此抽象概念透過 org.springframework.cache.Cacheorg.springframework.cache.CacheManager 介面實現。

Spring 提供了一些抽象概念的實作:基於 JDK java.util.concurrent.ConcurrentMap 的快取、Gemfire 快取、Caffeine,以及符合 JSR-107 標準的快取(例如 Ehcache 3.x)。如需關於外掛其他快取儲存和提供者的更多資訊,請參閱外掛不同的後端快取

快取抽象概念對於多執行緒和多進程環境沒有特殊的處理,因為這些功能由快取實作處理。

如果您有多進程環境(也就是說,應用程式部署在多個節點上),則需要相應地組態快取提供者。根據您的使用案例,在多個節點上複製相同的資料可能就足夠了。但是,如果您在應用程式執行期間變更資料,則可能需要啟用其他傳播機制。

快取特定項目直接等同於典型的 get-if-not-found-then-proceed-and-put-eventually 程式碼區塊,這些區塊在程式化快取互動中可以找到。不套用鎖定,並且多個執行緒可能會嘗試同時載入相同的項目。這同樣適用於逐出。如果多個執行緒嘗試同時更新或逐出資料,您可能會使用過時的資料。某些快取提供者在該領域提供進階功能。如需更多詳細資訊,請參閱快取提供者的文件。

若要使用快取抽象概念,您需要注意兩個方面

  • 快取宣告:識別需要快取的方法及其策略。

  • 快取組態:儲存和讀取資料的後端快取。