配置快取儲存

快取抽象提供了多種儲存整合選項。要使用它們,您需要宣告一個合適的 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 例項(名為 defaultbooks)建立了一個 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("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 還支援自定義 CaffeineCacheLoader。有關這些的更多資訊,請參閱 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 標誌為所有未由已配置的快取管理器處理的定義添加了一個無操作快取。也就是說,在 jdkCachegemfireCache(在示例中早些配置)中未找到的每個快取定義都將由無操作快取處理,該快取不儲存任何資訊,導致每次都呼叫目標方法。

© . This site is unofficial and not affiliated with VMware.