配置缓存存储
缓存抽象提供了几种存储集成选项。要使用它们,您需要声明一个适当的CacheManager
(控制和管理Cache
实例的实体,可用于检索这些实例以进行存储)。
基于JDK的ConcurrentMap
缓存
基于JDK的Cache
实现位于org.springframework.cache.concurrent
包下。它允许您将ConcurrentHashMap
用作后端Cache
存储。以下示例展示了如何配置两个缓存:
<!-- 简单缓存管理器 -->
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
<property name="caches">
<set>
<bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="default"/>
<bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="books"/>
</set>
</property>
</bean>
上述片段使用SimpleCacheManager
创建了一个CacheManager
,用于两个嵌套的ConcurrentMapCache
实例,分别命名为default
和books
。请注意,每个缓存的名称是直接配置的。
由应用程序创建的缓存与其生命周期绑定,适用于基本用例、测试或简单应用程序。该缓存具有良好的扩展性和非常快的速度,但不提供任何管理、持久性功能或驱逐协议。
基于Ehcache的缓存
Ehcache 3.x完全符合JSR-107标准,无需专门支持。有关详情,请参阅JSR-107缓存。
Caffeine缓存
Caffeine是Guava缓存的Java 8重写,其实现位于org.springframework.cache.caffeine
包中,并提供对Caffeine的多个功能的访问。
以下示例配置了一个按需创建缓存的CacheManager
:
<bean id="cacheManager"
class="org.springframework.cache.caffeine.CaffeineCacheManager"/>
您还可以显式提供要使用的缓存。在这种情况下,只有这些缓存可供管理器使用。以下示例展示了如何操作:
<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
。以下示例展示了如何操作:
<bean id="cacheManager"
class="org.springframework.cache.jcache.JCacheCacheManager"
p:cache-manager-ref="jCacheManager"/>
<!-- JSR-107缓存管理器设置 -->
<bean id="jCacheManager" .../>
处理没有后端存储的缓存
有时,在切换环境或进行测试时,您可能会有缓存声明,但没有实际配置后端缓存。由于这是无效配置,运行时会抛出异常,因为缓存基础设施无法找到合适的存储。在这种情况下,您可以将一个简单的虚拟缓存连接到系统中,不执行任何缓存操作,即每次都强制调用缓存方法。以下示例展示了如何操作:
<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
标志为所有未由配置的缓存管理器处理的定义添加了一个无操作缓存。也就是说,每个未在jdkCache
或gemfireCache
(在示例中早前配置)中找到的缓存定义都由无操作缓存处理,不存储任何信息,导致目标方法每次都被调用。