理解快取抽象
其核心是,快取抽象將快取應用於 Java 方法,從而根據快取中可用的資訊減少執行次數。也就是說,每次呼叫目標方法時,抽象都會應用快取行為,檢查該方法是否已經用給定的引數呼叫過。如果已經呼叫過,則返回快取結果,而無需呼叫實際方法。如果該方法尚未呼叫,則呼叫它,並將結果快取並返回給使用者,以便下次呼叫該方法時返回快取結果。這樣,昂貴的方法(無論是 CPU 密集型還是 IO 密集型)對於給定的一組引數只需呼叫一次,並且可以重用結果,而無需再次實際呼叫該方法。快取邏輯是透明應用的,不會對呼叫者產生任何干擾。
此方法僅適用於對於給定輸入(或引數)無論呼叫多少次,都保證返回相同輸出(結果)的方法。 |
快取抽象提供了其他與快取相關的操作,例如更新快取內容或移除一個或所有條目的能力。如果快取處理的資料在應用程式執行期間可能發生變化,這些操作就很有用。
與 Spring Framework 中的其他服務一樣,快取服務是一種抽象(而不是快取實現),需要使用實際儲存來儲存快取資料——也就是說,這種抽象使您無需編寫快取邏輯,但不提供實際的資料儲存。此抽象透過 org.springframework.cache.Cache
和 org.springframework.cache.CacheManager
介面得以具體化。
Spring 提供了該抽象的幾種實現:基於 JDK java.util.concurrent.ConcurrentMap
的快取、Gemfire 快取、Caffeine 和符合 JSR-107 規範的快取(例如 Ehcache 3.x)。有關接入其他快取儲存和提供程式的更多資訊,請參見接入不同的後端快取。
快取抽象對多執行緒和多程序環境沒有特殊處理,因為這些功能由快取實現處理。 |
如果您的環境是多程序的(即,應用程式部署在多個節點上),則需要相應地配置您的快取提供程式。根據您的用例,在多個節點上覆制相同的資料可能就足夠了。但是,如果您在應用程式執行期間更改資料,則可能需要啟用其他傳播機制。
快取特定項直接等同於在程式設計式快取互動中常見的“獲取-如果未找到-則繼續並最終放入”程式碼塊。不應用鎖,並且多個執行緒可能嘗試同時載入同一項。逐出也是如此。如果多個執行緒同時嘗試更新或逐出資料,您可能會使用陳舊資料。某些快取提供程式在此領域提供高階功能。有關更多詳細資訊,請參閱您的快取提供程式的文件。
要使用快取抽象,您需要處理兩個方面:
-
快取宣告:確定需要快取的方法及其策略。
-
快取配置:儲存資料和從中讀取資料的後端快取。