設定快取儲存
快取抽象化提供多種儲存整合選項。若要使用它們,您需要宣告適當的 CacheManager
(一個控制和管理 Cache
實例的實體,可用於檢索這些實例以進行儲存)。
基於 JDK ConcurrentMap
的快取
基於 JDK 的 Cache
實作位於 org.springframework.cache.concurrent
套件下。它可讓您使用 ConcurrentHashMap
作為後端 Cache
儲存。以下範例示範如何組態兩個快取
-
Java
-
Kotlin
-
Xml
@Bean
ConcurrentMapCacheFactoryBean defaultCache() {
ConcurrentMapCacheFactoryBean cache = new ConcurrentMapCacheFactoryBean();
cache.setName("default");
return cache;
}
@Bean
ConcurrentMapCacheFactoryBean booksCache() {
ConcurrentMapCacheFactoryBean cache = new ConcurrentMapCacheFactoryBean();
cache.setName("books");
return cache;
}
@Bean
CacheManager cacheManager(ConcurrentMapCache defaultCache, ConcurrentMapCache booksCache) {
SimpleCacheManager cacheManager = new SimpleCacheManager();
cacheManager.setCaches(Set.of(defaultCache, booksCache));
return cacheManager;
}
@Bean
fun defaultCache(): ConcurrentMapCacheFactoryBean {
return ConcurrentMapCacheFactoryBean().apply {
setName("default")
}
}
@Bean
fun booksCache(): ConcurrentMapCacheFactoryBean {
return ConcurrentMapCacheFactoryBean().apply {
setName("books")
}
}
@Bean
fun cacheManager(defaultCache: ConcurrentMapCache, booksCache: ConcurrentMapCache): CacheManager {
return SimpleCacheManager().apply {
setCaches(setOf(defaultCache, booksCache))
}
}
<!-- simple cache manager -->
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
<property name="caches">
<set>
<bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" name="default"/>
<bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" name="books"/>
</set>
</property>
</bean>
上述程式碼片段使用 SimpleCacheManager
為兩個巢狀 ConcurrentMapCache
實例 (名為 default
和 books
) 建立 CacheManager
。請注意,名稱是直接為每個快取設定的。
由於快取是由應用程式建立的,因此它會繫結到其生命週期,使其適用於基本使用案例、測試或簡單應用程式。快取具有良好的擴充性且速度非常快,但不提供任何管理、持久性功能或逐出合約。
基於 Ehcache 的快取
Ehcache 3.x 完全符合 JSR-107 標準,不需要專門的支援。如需詳細資訊,請參閱 JSR-107 快取。
Caffeine 快取
Caffeine 是 Guava 快取的 Java 8 重寫版本,其實作位於 org.springframework.cache.caffeine
套件中,並提供對 Caffeine 多項功能的存取。
以下範例組態一個 CacheManager
,它會依需建立快取
-
Java
-
Kotlin
-
Xml
@Bean
CacheManager cacheManager() {
return new CaffeineCacheManager();
}
@Bean
fun cacheManager(): CacheManager {
return CaffeineCacheManager()
}
<bean id="cacheManager" class="org.springframework.cache.caffeine.CaffeineCacheManager"/>
您也可以明確提供要使用的快取。在這種情況下,只有這些快取可供管理員使用。以下範例示範如何執行此操作
-
Java
-
Kotlin
-
Xml
@Bean
CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
cacheManager.setCacheNames(List.of("default", "books"));
return cacheManager;
}
@Bean
fun cacheManager(): CacheManager {
return CaffeineCacheManager().apply {
cacheNames = listOf("default", "books")
}
}
<bean id="cacheManager" class="org.springframework.cache.caffeine.CaffeineCacheManager">
<property name="cacheNames">
<set>
<value>default</value>
<value>books</value>
</set>
</property>
</bean>
Caffeine CacheManager
也支援自訂 Caffeine
和 CacheLoader
。如需有關這些項目的詳細資訊,請參閱 Caffeine 文件。
基於 GemFire 的快取
GemFire 是一個以記憶體為導向、磁碟支援、彈性可擴充、持續可用、主動式 (具有內建的基於模式的訂閱通知)、全域複寫的資料庫,並提供功能完整的邊緣快取。如需有關如何將 GemFire 用作 CacheManager
(以及更多) 的詳細資訊,請參閱 Spring Data GemFire 參考文件。
JSR-107 快取
Spring 的快取抽象化也可以使用符合 JSR-107 標準的快取。JCache 實作位於 org.springframework.cache.jcache
套件中。
同樣地,若要使用它,您需要宣告適當的 CacheManager
。以下範例示範如何執行此操作
-
Java
-
Kotlin
-
Xml
@Bean
javax.cache.CacheManager jCacheManager() {
CachingProvider cachingProvider = Caching.getCachingProvider();
return cachingProvider.getCacheManager();
}
@Bean
org.springframework.cache.CacheManager cacheManager(javax.cache.CacheManager jCacheManager) {
return new JCacheCacheManager(jCacheManager);
}
@Bean
fun jCacheManager(): javax.cache.CacheManager {
val cachingProvider = Caching.getCachingProvider()
return cachingProvider.getCacheManager()
}
@Bean
fun cacheManager(jCacheManager: javax.cache.CacheManager): org.springframework.cache.CacheManager {
return JCacheCacheManager(jCacheManager)
}
<bean id="cacheManager"
class="org.springframework.cache.jcache.JCacheCacheManager"
p:cache-manager-ref="jCacheManager"/>
<!-- JSR-107 cache manager setup -->
<bean id="jCacheManager" .../>
處理沒有後端儲存的快取
有時,在切換環境或進行測試時,您可能會在沒有組態實際後端快取的情況下宣告快取。由於這是無效的組態,因此會在執行階段擲回例外狀況,因為快取基礎架構無法找到合適的儲存。在這種情況下,您可以連線到一個簡單的虛擬快取,該快取不執行任何快取 (也就是說,它強制每次都調用快取方法),而不是移除快取宣告 (這可能會很繁瑣)。以下範例示範如何執行此操作
-
Java
-
Kotlin
-
Xml
@Bean
CacheManager cacheManager(CacheManager jdkCache, CacheManager gemfireCache) {
CompositeCacheManager cacheManager = new CompositeCacheManager();
cacheManager.setCacheManagers(List.of(jdkCache, gemfireCache));
cacheManager.setFallbackToNoOpCache(true);
return cacheManager;
}
@Bean
fun cacheManager(jdkCache: CacheManager, gemfireCache: CacheManager): CacheManager {
return CompositeCacheManager().apply {
setCacheManagers(listOf(jdkCache, gemfireCache))
setFallbackToNoOpCache(true)
}
}
<bean id="cacheManager" class="org.springframework.cache.support.CompositeCacheManager">
<property name="cacheManagers">
<list>
<ref bean="jdkCache"/>
<ref bean="gemfireCache"/>
</list>
</property>
<property name="fallbackToNoOpCache" value="true"/>
</bean>
上述程式碼中的 CompositeCacheManager
會鏈結多個 CacheManager
實例,並透過 fallbackToNoOpCache
旗標,為所有未由已組態快取管理員處理的定義新增一個 no-op 快取。也就是說,未在 jdkCache
或 gemfireCache
(先前在範例中組態) 中找到的每個快取定義都由 no-op 快取處理,該快取不儲存任何資訊,導致每次都調用目標方法。