配置缓存存储

缓存抽象提供了多种存储集成选项。要使用它们,您需要声明一个适当的 CacheManager(一个控制和管理 Cache 实例并可用于检索这些实例进行存储的实体)。

基于 JDK ConcurrentMap 的缓存

基于 JDK 的 Cache 实现位于 org.springframework.cache.concurrent 包下。它允许您使用 ConcurrentHashMap 作为后端 Cache 存储。以下示例展示了如何配置两个缓存:

前面的代码片段使用 SimpleCacheManager 为名为 defaultbooks 的两个嵌套 ConcurrentMapCache 实例创建 CacheManager。请注意,名称是为每个缓存直接配置的。

由于缓存是由应用程序创建的,因此它绑定到其生命周期,使其适用于基本用例、测试或简单应用程序。该缓存扩展性良好且速度非常快,但不提供任何管理、持久化功能或逐出契约。

基于 Ehcache 的缓存

Ehcache 3.x 完全符合 JSR-107 规范,无需为其提供专门支持。有关详细信息,请参阅 JSR-107 缓存

Caffeine 缓存

Caffeine 是 Guava 缓存的 Java 8 重写,其实现位于 org.springframework.cache.caffeine 包中,并提供了对 Caffeine 多个功能的访问。

以下示例配置了一个按需创建缓存的 CacheManager

您也可以显式提供要使用的缓存。在这种情况下,只有这些缓存由管理器提供。以下示例展示了如何实现:

Caffeine CacheManager 还支持自定义 CaffeineCacheLoader。有关这些的更多信息,请参阅 Caffeine 文档

基于 GemFire 的缓存

GemFire 是一个面向内存、磁盘支持、弹性可伸缩、持续可用、活跃(具有内置的基于模式的订阅通知)、全局复制的数据库,并提供功能齐全的边缘缓存。有关如何使用 GemFire 作为 CacheManager(以及更多)的更多信息,请参阅 Spring Data GemFire 参考文档

JSR-107 缓存

Spring 的缓存抽象也可以使用符合 JSR-107 的缓存。JCache 实现位于 org.springframework.cache.jcache 包中。

同样,要使用它,您需要声明适当的 CacheManager。以下示例展示了如何实现:

处理没有后端存储的缓存

有时,在切换环境或进行测试时,您可能有一些缓存声明,但没有配置实际的后端缓存。由于这是无效配置,运行时会抛出异常,因为缓存基础设施无法找到合适的存储。在这种情况下,与其删除缓存声明(这可能很繁琐),不如引入一个简单的虚拟缓存,它不执行任何缓存——也就是说,它强制每次都调用缓存方法。以下示例展示了如何实现:

前面示例中的 CompositeCacheManager 链接了多个 CacheManager 实例,并通过 fallbackToNoOpCache 标志为所有未由配置的缓存管理器处理的定义添加了一个无操作缓存。也就是说,所有在 jdkCachegemfireCache(在示例中前面配置的)中未找到的缓存定义都由无操作缓存处理,该缓存不存储任何信息,导致目标方法每次都被调用。