理解快取抽象
其核心在於,快取抽象將快取應用於 Java 方法,從而根據快取中可用的資訊減少執行次數。也就是說,每次呼叫目標方法時,抽象都會應用快取行為,檢查該方法是否已針對給定引數被呼叫。如果已呼叫,則直接返回快取結果,無需呼叫實際方法。如果方法尚未呼叫,則呼叫該方法,並將結果快取並返回給使用者,以便下次呼叫該方法時,返回快取結果。透過這種方式,開銷大的方法(無論是 CPU 密集型還是 IO 密集型)對於給定的一組引數只需呼叫一次,結果即可重複使用,而無需再次實際呼叫該方法。快取邏輯透明地應用,不會對呼叫者造成任何干擾。
| 這種方法僅適用於那些無論呼叫多少次,都保證針對給定輸入(或引數)返回相同輸出(結果)的方法。 |
快取抽象提供了其他與快取相關的操作,例如更新快取內容或刪除一個或所有條目的能力。如果快取處理的資料在應用程式執行過程中可能發生變化,這些操作會很有用。
與 Spring 框架中的其他服務一樣,快取服務是一種抽象(而不是快取實現),需要使用實際儲存來儲存快取資料——也就是說,該抽象使你無需編寫快取邏輯,但它不提供實際的資料儲存。這種抽象由 org.springframework.cache.Cache 和 org.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”程式碼塊。不應用鎖,並且多個執行緒可能嘗試併發載入同一項。驅逐也適用相同的情況。如果多個執行緒嘗試併發更新或驅逐資料,您可能會使用過時的資料。某些快取提供程式在該領域提供高階功能。有關更多詳細資訊,請參閱您的快取提供程式的文件。
要使用快取抽象,您需要注意兩個方面
-
快取宣告:識別需要快取的方法及其策略。
-
快取配置:儲存資料並從中讀取資料的後端快取。