配置缓存存储
缓存抽象提供了多种存储集成选项。要使用它们,您需要声明一个合适的 CacheManager
(一个控制和管理 Cache
实例的实体,可用于检索这些存储)。
基于 JDK ConcurrentMap
的缓存
基于 JDK 的Cache
实现位于org.springframework.cache.concurrent
包中。它允许你使用ConcurrentHashMap
作为后备Cache
存储。以下示例展示了如何配置两个缓存
<!-- simple cache manager -->
<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
为两个嵌套的ConcurrentMapCache
实例(名为default
和books
)创建一个CacheManager
。请注意,名称直接为每个缓存配置。
由于缓存是由应用程序创建的,因此它与其生命周期绑定,使其适合基本用例、测试或简单应用程序。该缓存具有良好的可扩展性且非常快速,但它不提供任何管理、持久性功能或逐出契约。
基于 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 cache manager setup -->
<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
(在示例中前面已配置)中找不到的每个缓存定义都由无操作缓存处理,该缓存不存储任何信息,从而导致每次都调用目标方法。