此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1Spring中文文档

Spring Framework 支持以透明方式向应用程序添加缓存。 从本质上讲,抽象将缓存应用于方法,从而根据缓存中的可用信息减少执行次数。 缓存逻辑是透明应用的,不会对调用程序造成任何干扰。 Spring Boot 会自动配置缓存基础结构,只要使用注释启用缓存支持即可。@EnableCachingSpring中文文档

有关更多详细信息,请查看 Spring Framework 参考的相关部分

简而言之,若要将缓存添加到服务的操作中,请将相关注释添加到其方法中,如以下示例所示:Spring中文文档

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;

@Component
public class MyMathService {

	@Cacheable("piDecimals")
	public int computePiDecimal(int precision) {
		...
	}

}
import org.springframework.cache.annotation.Cacheable
import org.springframework.stereotype.Component

@Component
class MyMathService {

	@Cacheable("piDecimals")
	fun computePiDecimal(precision: Int): Int {
		...
	}

}

此示例演示了如何在可能成本高昂的操作中使用缓存。 在调用之前,抽象会在缓存中查找与参数匹配的条目。 如果找到条目,缓存中的内容将立即返回给调用方,并且不会调用该方法。 否则,将调用该方法,并在返回值之前更新缓存。computePiDecimalpiDecimalsiSpring中文文档

您还可以透明地使用标准 JSR-107 (JCache) 注释(例如 )。 但是,我们强烈建议您不要混合搭配 Spring Cache 和 JCache 注释。@CacheResult

如果不添加任何特定的缓存库,Spring Boot 会自动配置一个使用内存中并发映射的简单提供程序。 当需要缓存时(如前面的示例中所示),此提供程序会为您创建缓存。 并不真正建议将简单的提供程序用于生产用途,但它非常适合入门并确保您了解这些功能。 当您决定使用缓存提供程序时,请务必阅读其文档,以了解如何配置应用程序使用的缓存。 几乎所有提供程序都要求您显式配置在应用程序中使用的每个缓存。 有些提供了一种自定义属性定义的默认缓存的方法。piDecimalsspring.cache.cache-namesSpring中文文档

还可以透明地更新或从缓存中逐出数据。
有关更多详细信息,请查看 Spring Framework 参考的相关部分
您还可以透明地使用标准 JSR-107 (JCache) 注释(例如 )。 但是,我们强烈建议您不要混合搭配 Spring Cache 和 JCache 注释。@CacheResult
还可以透明地更新或从缓存中逐出数据。

支持的缓存提供程序

缓存抽象不提供实际的存储,而是依赖于 和 接口具体化的抽象。org.springframework.cache.Cacheorg.springframework.cache.CacheManagerSpring中文文档

如果尚未定义类型或命名的 bean(请参阅 CachingConfigurer),则 Spring Boot 将尝试检测以下提供程序(按指示的顺序):CacheManagerCacheResolvercacheResolverSpring中文文档

如果 是 Spring Boot 自动配置的,则可以通过设置属性来强制使用特定的缓存提供程序。 如果需要在某些环境(如测试)中使用无操作缓存,请使用此属性。CacheManagerspring.cache.type
使用“Starter”快速添加基本缓存依赖项。 启动器带来. 如果您手动添加依赖项,则必须包含才能使用 JCache 或 Caffeine 支持。spring-boot-starter-cachespring-context-supportspring-context-support

如果 是 Spring Boot 自动配置的,那么在完全初始化之前,可以通过公开实现接口的 Bean 来进一步调整其配置。 以下示例设置了一个标志,表示不应将值传递到底层映射:CacheManagerCacheManagerCustomizernullSpring中文文档

import org.springframework.boot.autoconfigure.cache.CacheManagerCustomizer;
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration(proxyBeanMethods = false)
public class MyCacheManagerConfiguration {

	@Bean
	public CacheManagerCustomizer<ConcurrentMapCacheManager> cacheManagerCustomizer() {
		return (cacheManager) -> cacheManager.setAllowNullValues(false);
	}

}
import org.springframework.boot.autoconfigure.cache.CacheManagerCustomizer
import org.springframework.cache.concurrent.ConcurrentMapCacheManager
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration(proxyBeanMethods = false)
class MyCacheManagerConfiguration {

	@Bean
	fun cacheManagerCustomizer(): CacheManagerCustomizer<ConcurrentMapCacheManager> {
		return CacheManagerCustomizer { cacheManager ->
			cacheManager.isAllowNullValues = false
		}
	}

}
在前面的示例中,需要自动配置。 如果不是这种情况(您提供了自己的配置或自动配置了其他缓存提供程序),则根本不会调用定制器。 您可以根据需要拥有任意数量的定制器,也可以使用 或 对它们进行排序。ConcurrentMapCacheManager@OrderOrdered

通用

如果上下文定义了至少一个 Bean,则使用泛型缓存。 将创建一个包装该类型的所有 Bean。org.springframework.cache.CacheCacheManagerSpring中文文档

JCache (JSR-107)

JCache 通过类路径上存在 a 进行引导(即类路径上存在符合 JSR-107 的缓存库),并且由“Starter”提供。 提供了各种兼容库,Spring Boot 为 Ehcache 3、Hazelcast 和 Infinispan 提供了依赖项管理。 也可以添加任何其他兼容库。javax.cache.spi.CachingProviderJCacheCacheManagerspring-boot-starter-cacheSpring中文文档

可能会出现多个提供程序的情况,在这种情况下,必须显式指定提供程序。 即使 JSR-107 标准没有强制执行定义配置文件位置的标准化方法,Spring Boot 也会尽最大努力设置具有实现详细信息的缓存,如以下示例所示:Spring中文文档

spring.cache.jcache.provider=com.example.MyCachingProvider
spring.cache.jcache.config=classpath:example.xml
# Only necessary if more than one provider is present
spring:
  cache:
    jcache:
      provider: "com.example.MyCachingProvider"
      config: "classpath:example.xml"
当缓存库同时提供本机实现和 JSR-107 支持时,Spring Boot 更喜欢 JSR-107 支持,因此,如果您切换到不同的 JSR-107 实现,可以使用相同的功能。
Spring Boot 对 Hazelcast 有一般支持。 如果单个可用,则除非指定了该属性,否则该属性也会自动重用。HazelcastInstanceCacheManagerspring.cache.jcache.config

有两种方法可以自定义底层:javax.cache.cacheManagerSpring中文文档

  • 可以通过设置属性在启动时创建缓存。 如果定义了自定义 Bean,则用于自定义它们。spring.cache.cache-namesjavax.cache.configuration.ConfigurationSpring中文文档

  • org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizerBean 是使用 for full customization 的引用来调用的。CacheManagerSpring中文文档

如果定义了标准 Bean,它将自动包装在抽象所期望的实现中。 不会对其应用进一步的自定义。javax.cache.CacheManagerorg.springframework.cache.CacheManager

黑兹尔卡斯特

Spring Boot 对 Hazelcast 有一般支持。 如果 a 已自动配置并且位于类路径上,则它会自动包装在 .HazelcastInstancecom.hazelcast:hazelcast-springCacheManagerSpring中文文档

Hazelcast 可以用作 JCache 兼容缓存或 Spring 兼容缓存。 当设置为 时,Spring Boot 将使用基于的实现。 如果要使用 Hazelcast 作为 JCache 兼容缓存,请设置为 . 如果您有多个 JCache 兼容缓存提供程序并想要强制使用 Hazelcast,您必须显式设置 JCache 提供程序CacheManagerspring.cache.typehazelcastCacheManagerspring.cache.typejcache

英菲尼斯潘

Infinispan 没有默认配置文件位置,因此必须显式指定。 否则,将使用默认引导程序。Spring中文文档

spring.cache.infinispan.config=infinispan.xml
spring:
  cache:
    infinispan:
      config: "infinispan.xml"

可以通过设置属性在启动时创建缓存。 如果定义了自定义 Bean,则用于自定义缓存。spring.cache.cache-namesConfigurationBuilderSpring中文文档

为了与Spring Boot的Jakarta EE 9基线兼容,必须使用Infinispan的模块。 对于每个具有变体的模块,必须使用该变体代替标准模块。 例如,必须分别使用 和 来代替 和 。-jakarta-jakartainfinispan-core-jakartainfinispan-commons-jakartainfinispan-coreinfinispan-commonsSpring中文文档

沙发底座

如果 Spring Data Couchbase 可用且配置了 Couchbase,则会自动配置 a。 可以通过设置属性在启动时创建其他缓存,并且可以使用属性配置缓存默认值。 例如,以下配置创建和缓存条目过期时间为 10 分钟:CouchbaseCacheManagerspring.cache.cache-namesspring.cache.couchbase.*cache1cache2Spring中文文档

spring.cache.cache-names=cache1,cache2
spring.cache.couchbase.expiration=10m
spring:
  cache:
    cache-names: "cache1,cache2"
    couchbase:
      expiration: "10m"

如果您需要对配置进行更多控制,请考虑注册 Bean。 下面的示例演示一个定制器,该定制器为 和 配置特定条目的过期时间:CouchbaseCacheManagerBuilderCustomizercache1cache2Spring中文文档

import java.time.Duration;

import org.springframework.boot.autoconfigure.cache.CouchbaseCacheManagerBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.couchbase.cache.CouchbaseCacheConfiguration;

@Configuration(proxyBeanMethods = false)
public class MyCouchbaseCacheManagerConfiguration {

	@Bean
	public CouchbaseCacheManagerBuilderCustomizer myCouchbaseCacheManagerBuilderCustomizer() {
		return (builder) -> builder
				.withCacheConfiguration("cache1", CouchbaseCacheConfiguration
						.defaultCacheConfig().entryExpiry(Duration.ofSeconds(10)))
				.withCacheConfiguration("cache2", CouchbaseCacheConfiguration
						.defaultCacheConfig().entryExpiry(Duration.ofMinutes(1)));

	}

}
import org.springframework.boot.autoconfigure.cache.CouchbaseCacheManagerBuilderCustomizer
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.data.couchbase.cache.CouchbaseCacheConfiguration
import java.time.Duration

@Configuration(proxyBeanMethods = false)
class MyCouchbaseCacheManagerConfiguration {

	@Bean
	fun myCouchbaseCacheManagerBuilderCustomizer(): CouchbaseCacheManagerBuilderCustomizer {
		return CouchbaseCacheManagerBuilderCustomizer { builder ->
			builder
				.withCacheConfiguration(
					"cache1", CouchbaseCacheConfiguration
						.defaultCacheConfig().entryExpiry(Duration.ofSeconds(10))
				)
				.withCacheConfiguration(
					"cache2", CouchbaseCacheConfiguration
						.defaultCacheConfig().entryExpiry(Duration.ofMinutes(1))
				)
		}
	}

}

Redis(瑞迪斯酒店)

如果 Redis 可用且已配置,则会自动配置 a。 可以通过设置属性在启动时创建其他缓存,并且可以使用属性配置缓存默认值。 例如,以下配置创建和缓存的生存时间为 10 分钟:RedisCacheManagerspring.cache.cache-namesspring.cache.redis.*cache1cache2Spring中文文档

spring.cache.cache-names=cache1,cache2
spring.cache.redis.time-to-live=10m
spring:
  cache:
    cache-names: "cache1,cache2"
    redis:
      time-to-live: "10m"
默认情况下,会添加一个键前缀,以便在两个单独的缓存使用相同的键时,Redis 没有重叠的键,并且不会返回无效值。 如果您创建自己的 .RedisCacheManager
您可以通过添加自己的配置来完全控制默认配置。 如果需要自定义默认序列化策略,这可能很有用。RedisCacheConfiguration@Bean

如果您需要对配置进行更多控制,请考虑注册 Bean。 以下示例显示了一个定制器,该定制器将特定时间配置为:RedisCacheManagerBuilderCustomizercache1cache2Spring中文文档

import java.time.Duration;

import org.springframework.boot.autoconfigure.cache.RedisCacheManagerBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;

@Configuration(proxyBeanMethods = false)
public class MyRedisCacheManagerConfiguration {

	@Bean
	public RedisCacheManagerBuilderCustomizer myRedisCacheManagerBuilderCustomizer() {
		return (builder) -> builder
				.withCacheConfiguration("cache1", RedisCacheConfiguration
						.defaultCacheConfig().entryTtl(Duration.ofSeconds(10)))
				.withCacheConfiguration("cache2", RedisCacheConfiguration
						.defaultCacheConfig().entryTtl(Duration.ofMinutes(1)));

	}

}
import org.springframework.boot.autoconfigure.cache.RedisCacheManagerBuilderCustomizer
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.data.redis.cache.RedisCacheConfiguration
import java.time.Duration

@Configuration(proxyBeanMethods = false)
class MyRedisCacheManagerConfiguration {

	@Bean
	fun myRedisCacheManagerBuilderCustomizer(): RedisCacheManagerBuilderCustomizer {
		return RedisCacheManagerBuilderCustomizer { builder ->
			builder
				.withCacheConfiguration(
					"cache1", RedisCacheConfiguration
						.defaultCacheConfig().entryTtl(Duration.ofSeconds(10))
				)
				.withCacheConfiguration(
					"cache2", RedisCacheConfiguration
						.defaultCacheConfig().entryTtl(Duration.ofMinutes(1))
				)
		}
	}

}

咖啡因

Caffeine 是 Java 8 对 Guava 缓存的重写,它取代了对 Guava 的支持。 如果存在咖啡因,则自动配置(由“启动器”提供)。 可以通过设置属性在启动时创建缓存,并且可以通过以下方法之一(按指示的顺序)进行自定义:CaffeineCacheManagerspring-boot-starter-cachespring.cache.cache-namesSpring中文文档

  1. 缓存规范定义spring.cache.caffeine.specSpring中文文档

  2. 定义了 Beancom.github.benmanes.caffeine.cache.CaffeineSpecSpring中文文档

  3. 定义了 Beancom.github.benmanes.caffeine.cache.CaffeineSpring中文文档

例如,以下配置创建和缓存的最大大小为 500,生存时间为 10 分钟cache1cache2Spring中文文档

spring.cache.cache-names=cache1,cache2
spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s
spring:
  cache:
    cache-names: "cache1,cache2"
    caffeine:
      spec: "maximumSize=500,expireAfterAccess=600s"

如果定义了 Bean,则会自动将其关联到 . 由于 将与缓存管理器管理的所有缓存相关联,因此必须将其定义为 。 自动配置将忽略任何其他泛型类型。com.github.benmanes.caffeine.cache.CacheLoaderCaffeineCacheManagerCacheLoaderCacheLoader<Object, Object>Spring中文文档

缓存2k

Cache2k 是一个内存中缓存。 如果存在 Cache2k 弹簧集成,则会自动配置 a。SpringCache2kCacheManagerSpring中文文档

可以通过设置属性在启动时创建缓存。 可以使用 Bean 自定义缓存缺省值。 以下示例显示了一个定制器,该定制器将缓存的容量配置为 200 个条目,过期时间为 5 分钟:spring.cache.cache-namesCache2kBuilderCustomizerSpring中文文档

import java.util.concurrent.TimeUnit;

import org.springframework.boot.autoconfigure.cache.Cache2kBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration(proxyBeanMethods = false)
public class MyCache2kDefaultsConfiguration {

	@Bean
	public Cache2kBuilderCustomizer myCache2kDefaultsCustomizer() {
		return (builder) -> builder.entryCapacity(200)
				.expireAfterWrite(5, TimeUnit.MINUTES);
	}

}
import org.springframework.boot.autoconfigure.cache.Cache2kBuilderCustomizer
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import java.util.concurrent.TimeUnit

@Configuration(proxyBeanMethods = false)
class MyCache2kDefaultsConfiguration {

	@Bean
	fun myCache2kDefaultsCustomizer(): Cache2kBuilderCustomizer {
		return Cache2kBuilderCustomizer { builder ->
			builder.entryCapacity(200)
				.expireAfterWrite(5, TimeUnit.MINUTES)
		}
	}
}

简单

如果找不到其他提供程序,则配置使用 作为缓存存储的简单实现。 如果应用程序中不存在缓存库,则这是默认设置。 默认情况下,会根据需要创建缓存,但可以通过设置属性来限制可用缓存的列表。 例如,如果只想和缓存,请按如下方式设置属性:ConcurrentHashMapcache-namescache1cache2cache-namesSpring中文文档

spring.cache.cache-names=cache1,cache2
spring:
  cache:
    cache-names: "cache1,cache2"

如果这样做并且应用程序使用未列出的缓存,则在需要缓存时,它会在运行时失败,但在启动时不会失败。 这类似于使用未声明的缓存时“真实”缓存提供程序的行为方式。Spring中文文档

没有

当配置中存在时,还需要合适的缓存配置。 如果您有自定义,请考虑在单独的类中定义它,以便在必要时可以覆盖它。 None 使用在测试中有用的无操作实现,切片测试默认通过 .@EnableCachingCacheManager@Configuration@AutoConfigureCacheSpring中文文档

如果需要在特定环境中使用无操作缓存而不是自动配置的缓存管理器,请将缓存类型设置为 ,如以下示例所示:noneSpring中文文档

spring.cache.type=none
spring:
  cache:
    type: "none"
如果 是 Spring Boot 自动配置的,则可以通过设置属性来强制使用特定的缓存提供程序。 如果需要在某些环境(如测试)中使用无操作缓存,请使用此属性。CacheManagerspring.cache.type
使用“Starter”快速添加基本缓存依赖项。 启动器带来. 如果您手动添加依赖项,则必须包含才能使用 JCache 或 Caffeine 支持。spring-boot-starter-cachespring-context-supportspring-context-support
在前面的示例中,需要自动配置。 如果不是这种情况(您提供了自己的配置或自动配置了其他缓存提供程序),则根本不会调用定制器。 您可以根据需要拥有任意数量的定制器,也可以使用 或 对它们进行排序。ConcurrentMapCacheManager@OrderOrdered
当缓存库同时提供本机实现和 JSR-107 支持时,Spring Boot 更喜欢 JSR-107 支持,因此,如果您切换到不同的 JSR-107 实现,可以使用相同的功能。
Spring Boot 对 Hazelcast 有一般支持。 如果单个可用,则除非指定了该属性,否则该属性也会自动重用。HazelcastInstanceCacheManagerspring.cache.jcache.config
如果定义了标准 Bean,它将自动包装在抽象所期望的实现中。 不会对其应用进一步的自定义。javax.cache.CacheManagerorg.springframework.cache.CacheManager
Hazelcast 可以用作 JCache 兼容缓存或 Spring 兼容缓存。 当设置为 时,Spring Boot 将使用基于的实现。 如果要使用 Hazelcast 作为 JCache 兼容缓存,请设置为 . 如果您有多个 JCache 兼容缓存提供程序并想要强制使用 Hazelcast,您必须显式设置 JCache 提供程序CacheManagerspring.cache.typehazelcastCacheManagerspring.cache.typejcache
默认情况下,会添加一个键前缀,以便在两个单独的缓存使用相同的键时,Redis 没有重叠的键,并且不会返回无效值。 如果您创建自己的 .RedisCacheManager
您可以通过添加自己的配置来完全控制默认配置。 如果需要自定义默认序列化策略,这可能很有用。RedisCacheConfiguration@Bean