理解快取抽象

Cache 對比 Buffer

術語“buffer”(緩衝區)和“cache”(快取)傾向於互換使用。然而,請注意它們代表著不同的事物。傳統上,buffer 用作快慢實體之間資料的中間臨時儲存。由於一方必須等待另一方(這會影響效能),buffer 透過允許整塊資料一次性移動而不是小塊資料來緩解此問題。資料只從 buffer 中寫入和讀取一次。此外,buffer 對至少一個知曉它的實體是可見的。

另一方面,根據定義,cache 是隱藏的,並且雙方都不知道正在進行快取。它也透過允許相同的資料以快速方式被多次讀取來提高效能。

您可以在這裡找到關於 buffer 和 cache 之間差異的進一步解釋。

其核心是,快取抽象將快取應用於 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)。有關接入其他快取儲存和提供程式的更多資訊,請參見接入不同的後端快取

快取抽象對多執行緒和多程序環境沒有特殊處理,因為這些功能由快取實現處理。

如果您的環境是多程序的(即,應用程式部署在多個節點上),則需要相應地配置您的快取提供程式。根據您的用例,在多個節點上覆制相同的資料可能就足夠了。但是,如果您在應用程式執行期間更改資料,則可能需要啟用其他傳播機制。

快取特定項直接等同於在程式設計式快取互動中常見的“獲取-如果未找到-則繼續並最終放入”程式碼塊。不應用鎖,並且多個執行緒可能嘗試同時載入同一項。逐出也是如此。如果多個執行緒同時嘗試更新或逐出資料,您可能會使用陳舊資料。某些快取提供程式在此領域提供高階功能。有關更多詳細資訊,請參閱您的快取提供程式的文件。

要使用快取抽象,您需要處理兩個方面:

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

  • 快取配置:儲存資料和從中讀取資料的後端快取。