Spring Boot 缓存提供程序

2025年3月18日 | 阅读 5 分钟

Spring Boot 框架允许集成各种缓存提供程序,例如 EhCache、Redis、Hazelcast、Infinispan、Caffeine 等。缓存提供程序允许开发人员在应用程序中透明且显式地配置缓存。我们应该使用缓存,因为它减少了执行次数并提高了应用程序的性能。

Spring Boot 中,缓存抽象不提供缓存的实际空间。它依赖于由 org.springframework.cache.Cacheorg.springframework.cache.CacheManager 接口发生的抽象。

缓存自动配置

Spring Boot 框架通过自动配置支持简化了缓存的实现。它在类路径中搜索库和配置文件,并在应用程序启动时初始化所需的依赖项 bean。缓存的自动配置包括以下步骤

  • 在配置文件中添加注释 @EnableCaching
  • 在类路径中添加所需的 缓存库
  • 在类路径的根目录下添加 缓存提供程序的配置文件

例如,如果我们想在应用程序中实现 EhCache,首先我们在配置文件中启用缓存。

pom.xml 文件中添加 EhCache 依赖项。它将所需的库添加到类路径中。

最后,配置缓存提供程序的 文件。在这里,我们使用 EhCache,因此需要在类路径的根目录下配置 ehcache.xml 文件。

当我们未定义类型为 CacheManagerCacheResolver 的 bean 时,Spring Boot 框架尝试检测以下缓存提供程序

  1. 通用
  2. JCache
  3. EhCache
  4. Hazelcast
  5. Infinispan
  6. Couchbase
  7. Redis
  8. Caffeine
  9. 简单

如果 Spring Boot 在类路径中找到了多个缓存提供程序,在这种情况下,我们必须在 application.properties 文件中明确指定缓存提供程序。

我们可以使用属性 spring.cache.type 设置特定的缓存提供程序。如果我们要禁用缓存,则在特定环境中使用它。

Spring Boot 框架提供了一个启动器依赖项,该依赖项将基本的缓存依赖项添加到应用程序中。默认情况下,启动器缓存依赖项提供了 spring-context-support 依赖项。

注意:如果我们要手动添加缓存依赖项,则必须在 pom.xml 文件中包含 spring-context-support 依赖项。因为,它提供了对 Jcache、EhCache 和 Caffiene 的支持。

Spring Boot 框架会自动配置 CacheManager,可以通过实现 CacheManagerCustomizer 接口进行进一步自定义。

在以下示例中,我们设置了一个标志,将空值传递给主映射。

上面的 bean 期望一个自动配置的 ConcurrentMapCacheManager。如果未自动配置 ConcurrentMapCacheManager,则定制器将不会以任何方式调用。我们可以有任意数量的定制器,并使用注释 @Order@Ordered 按顺序排列它们。

通用缓存

如果 spring-context-support 定义了至少一个 org.springframework.cache.Cache bean,则它使用通用缓存。 CacheManager 捆绑了所有 bean 并对其进行了配置。

JCache

JCache 是由 javax.cache.spi.CahingProvider. 提供的自启动过程。它存在于类路径 JSR 107 上。spring-boot-starter-cache 提供了 JCacheCacheManager。 我们也可以添加任何其他缓存库。

注意:如果缓存库同时提供本机实现和 JSR 支持,则 Spring Boot 优先使用 JSR 支持。

EhCache 2.x

EHCache 是基于 Java 的、开源的、广泛使用的缓存。为了使用 EhCache,我们应该使用以下依赖项。

有两种配置 EhCache 的方法

  • 首先,通过配置 Java POJO 文件,其中所有配置参数都通过 EhCache API 进行配置。
  • 其次,通过配置 XML 文件,我们在其中根据提供的模式定义配置 EhCache。

EhCache 使用一个名为 ehcache.xml 的文件。 如果应用程序在类路径中找到了该文件,则 spring-boot-starter-cache 提供的 EhCacheCacheManager。我们可以使用以下属性配置 XML 文件

Hazelcast

当我们在应用程序中启用缓存时,Spring Boot 会自动将 HazelcastInstance 包装在 CacheManager 中。它将数据在节点之间平均分配。我们可以使用以下属性配置 Hazelcast。

如果未设置该属性,则 Spring Boot 会尝试在类路径中查找 hazelcast.xml (Hazelcast 配置)文件。

Infinispan

Infinispan 是一个嵌入式 Java 库。它用作缓存数据网格。它以 键值 形式存储数据。它可以轻松地与 JCache、JPA Quarkus、Spring 等集成。

它没有默认的文件位置,因此我们应该明确指定它。如果未明确指定 Infinispan,它将使用默认的引导程序。

Couchbase

当我们实现 couchbase-spring-cache 并且配置了 Couchbase 时,CouchebaseCacheManager 会自动配置。与缓存相关的所有操作都在 Bucket 中执行。它允许我们通过设置属性 spring.cache.cache-name. 创建其他缓存(如果需要)。

定制器允许我们创建其他 Buckets,我们可以在其中创建另一个缓存。

让我们通过一个例子来理解上面的概念。

假设我们需要三个名为 cacheAcacheBcacheC 的缓存。 cacheA 和 cacheB 在主 Bucket 上(即自动配置的 Bucket)。 cacheC 在另一个 Bucket 上,该 Bucket 将存在几秒钟,例如 4 秒。因此,我们可以通过指定属性来创建 cacheA 和 cacheB,如下所示

Redis

当我们配置 Redis 时,RedisCacheManager 会自动配置。它还允许我们使用属性 spring.cache.cache-names 创建其他缓存。可以使用属性 spring.cache.redis.* 实现默认配置。

我们可以通过使用 RedisCacheConfiguration bean 来完全控制默认配置。

上面的属性配置了两个名为 cacheA 和 cacheB 的缓存,它们存在 10 分钟。

Caffeine

Caffeine 是一个基于 Java 的缓存库。它还提供了一个内存缓存。如果它在类路径中找到了 Caffeine,则 spring-boot-starter-cache 依赖项会自动配置 CaffeineCacheManger。如果要在应用程序中使用 Caffeine,我们需要添加以下依赖项

Caffeine 缓存允许我们使用属性 spring.cache.caffeine.spec. 定义缓存的 大小生存时间。例如

上面的配置创建了两个名为 cache1 和 cache2 的缓存。缓存的最大大小为 500,缓存的最大生存时间为 6 秒。

简单

它是默认实现。如果未指定缓存提供程序。如果 Spring Boot 在类路径中找不到任何缓存提供程序,则它将 ConcurrentHashMap 配置为缓存存储。

例如,如果我们需要两个缓存,则使用以下属性设置它们的名称

当通过注释 @EnableCaching 启用缓存时,应用程序期望一个合适的配置。当我们想在某个环境中 禁用 缓存时,使用它。我们使用属性 spring.cache.type 来禁用缓存。