|
对于最新的稳定版本,请使用 Spring Framework 7.0.6! |
配置缓存存储
缓存抽象提供了几种存储集成选项。要使用它们,你需要声明一个适当的 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 为两个名为 default 和 books 的嵌套 ConcurrentMapCache 实例创建了一个 CacheManager。请注意,名称是直接为每个缓存配置的。
当缓存由应用程序创建时,它与其生命周期绑定,这使其适用于基本用例、测试或简单应用。缓存扩展性良好且非常快速,但不提供任何管理、持久化能力或逐出协议。
基于Ehcache的缓存
Ehcache 3.x 完全符合 JSR-107 规范,因此不需要专门的支持。详情请参见 JSR-107 缓存。
咖啡因缓存
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(在示例中之前配置的)中的缓存定义都由无操作缓存处理,该缓存不存储任何信息,导致目标方法每次都被调用。