SpringBoot2官方参考中文版11--Caching缓存

11. Caching

Spring框架支持透明地向应用程序添加缓存。在其核心,抽象类将缓存应用于方法,从而根据缓存中可用的信息减少后台执行次数。缓存逻辑对应用是透明,不会对调用程序产生任何干扰。只要通过@EnableCaching注释启用了缓存支持,Springboot就会自动配置缓存基础结构。

有关更多详细信息,请查看Spring框架参考的相关部分。
简而言之,向服务的操作添加缓存与向其方法添加相关注释一样简单,如下面的示例所示:

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

@Component
public class MathService {

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

}

这个例子演示了在一个可能代价高昂的操作上使用缓存。在调用computePiDecimal之前,抽象在piDecimals 缓存中查找与i参数匹配的条目。如果找到一个条目,缓存中的内容将立即返回给调用方,并且不会调用该方法。否则,将调用该方法,并在返回值之前更新缓存。

您还可以透明地使用标准JSR-107(JCache)注释(例如@CacheResult)。但是,我们强烈建议您不要混合和匹配Spring缓存和JCache注释。
如果不添加任何特定的缓存库,SpringBoot会自动配置一个简单的提供者,该提供者在内存中使用并发映射。当需要缓存时(如前面示例中的 piDecimals),此提供程序将为您创建缓存。在生产不推荐这样使用,但它对于入门和确保您了解这些特性非常有用。当您决定要使用的缓存提供程序时,请确保阅读其文档以了解如何配置应用程序使用的缓存。几乎所有提供程序都要求您显式配置应用程序中使用的每个缓存。有些提供了一种自定义 spring.cache.cache-names属性定义的默认缓存的方法。

还可以透明地更新或从缓存中移除 数据。

11.1. 支持的缓存提供程序

缓存抽象类不提供实际的存储,它依赖于由 org.springframework.cache.Cacheorg.springframework.cache.CacheManager接口实现的抽象。

如果尚未定义类型为CacheManager的bean或名为CacheResolver的CacheResolver(请参阅CachingConfigurer),则Springboot将尝试检测以下提供程序(按指示的顺序):

  • Generic
  • JCache (JSR-107) (包括EhCache 3, Hazelcast,Infinispan, 和其它)
  • EhCache 2.x
  • Hazelcast
  • Infinispan
  • Couchbase
  • Redis
  • Caffeine
  • Simple

还可以通过设置spring.cache.type属性强制特定的缓存提供程序。如果需要在特定环境(如测试)中完全禁用缓存 ,请使用此属性。
使用 spring-boot-starter-cache的“starter”快速添加基本缓存依赖项。starter引入了 spring-context-support。如果手动添加依赖项,则必须包含 spring-context-support才能使用JCache、ehcache 2.x或guava支持。
如果 CacheManager是由Spring boot自动配置的,那么在完全初始化之前,可以通过公开实现CacheManagerCustomizer接口的bean进一步优化其配置。下面的示例设置一个标志,表示应将空值传递给基础映射:

@Bean
public CacheManagerCustomizer<ConcurrentMapCacheManager> cacheManagerCustomizer() {
    return new CacheManagerCustomizer<ConcurrentMapCacheManager>() {
        @Override
        public void customize(ConcurrentMapCacheManager cacheManager) {
            cacheManager.setAllowNullValues(false);
        }
    };
}

在前面的示例中,需要自动配置的ConcurrentMapCacheManager。如果不是这样(您提供了自己的配置,或者自动配置了其他缓存提供程序),则根本不会调用自定义程序。您可以有任意多的定制程序,也可以使用@Order 或Ordered来确定顺序。

11.1.1.通用缓存

如果上下文定义了至少一个org.springframework.cache.Cache bean,则使用通用缓存。将创建一个包装该类型所有bean的 CacheManager 。

11.1.2. JCache (JSR-107)

JCache 是通过类路径上存在javax.cache.spi.CachingProvider(也就是说,类路径上存在符合JSR-107的缓存库)来引导的,JCacheCacheManager 由spring-boot-starter-cache的“starter”提供。SpringBoot为ehcache 3、hazelcast和infinispan提供依赖性管理。也可以添加任何其他兼容的库。

可能会出现多个缓存提供程序,在这种情况下,必须显式指定提供程序。即使JSR-107标准没有强制使用标准化的方法来定义配置文件的位置,Springboot也会尽其所能地设置缓存,如下例所示:

#Only necessary if more than one provider is present
spring.cache.jcache.provider=com.acme.MyCachingProvider
spring.cache.jcache.config=classpath:acme.xml

当缓存库同时有本机实现和JSR-107支持时,Spring Boot更倾向于JSR-107支持,如果切换到不同的JSR-107实现,也同样这样。
Spring Boot一般支持 Hazelcast。如果一个 HazelcastInstance可用,那么它也会自动为CacheManager 重用,除非指定了 spring.cache.jcache.config属性。
自定义底层javax.cache.cachemanager有两种方法:

可以通过设置 spring.cache.cache-names属性在启动时创建缓存。如果定义了一个自定义javax.cache.configuration.Configuration bean,它将用于自定义它们。

调用org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer bean时引用CacheManager进行完全自定义。

如果定义了标准javax.cache.CacheManager bean,它将自动包装在抽象类预期的 org.springframework.cache.CacheManager实现中,不应用进一步的自定义。

11.1.3. EhCache 2.x

如果在类路径的根目录下找到名为ehcache.xml的文件,则使用EhCache 2.x,并使用spring-boot-starter-cache 的“starter”提供EhCacheCacheManager 来引导缓存管理器。还可以提供备用配置文件,如以下示例所示:

spring.cache.ehcache.config=classpath:config/another-config.xml

11.1.4. Hazelcast

Spring Boot一般支持HazelcastInstance 。如果HazelcastInstance已自动配置,它将自动包装在CacheManager.中。

11.1.5. Infinispan

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

spring.cache.infinispan.config=infinispan.xml

可以通过设置spring.cache.cache-names属性在启动时创建缓存。如果定义了自定义的ConfigurationBuilder bean,那么它将用于自定义缓存。

InfiniSpan在Spring Boot中的支持仅限于嵌入式模式,而且非常基础。如果你想要更多的选择,你应该使用官方的Infinispan Spring Boot starter 。有关详细信息,请参阅Infinispan的文档。

11.1.6. Couchbase

如果Couchbase Java客户端和couchbase-spring-cache实现都可用,并且Couchbase被配置,则自动配置一个CouchbaseCacheManager 。还可以通过设置 spring.cache.cache-names 属性在启动时创建其他缓存。这些缓存在自动配置的bucket上运行。您还可以使用自定义器在另一个bucket上创建其他缓存。假设您需要在主要Bucket上有两个缓存(cache1和cache2),在另一个”Bucket 上有一个(cache3)缓存,自定义生存时间为2秒。您可以通过配置创建前两个缓存,如下所示:

spring.cache.cache-names=cache1,cache2

然后可以定义@Configuration 类来配置额外的bucket和cache3缓存,如下所示:

@Configuration
public class CouchbaseCacheConfiguration {

    private final Cluster cluster;

    public CouchbaseCacheConfiguration(Cluster cluster) {
        this.cluster = cluster;
    }

    @Bean
    public Bucket anotherBucket() {
        return this.cluster.openBucket("another", "secret");
    }

    @Bean
    public CacheManagerCustomizer<CouchbaseCacheManager> cacheManagerCustomizer() {
        return c -> {
            c.prepareCache("cache3", CacheBuilder.newInstance(anotherBucket())
                    .withExpiration(2));
        };
    }

}

此示例的配置重用了通过自动配置创建的集群。

11.1.7. Redis

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

spring.cache.cache-names=cache1,cache2
spring.cache.redis.time-to-live=600000

默认情况下,会添加一个键前缀,这样,如果两个单独的缓存使用同一个键,redis就不会有重叠的键,也不会返回无效的值。如果您创建自己的RedisCacheManager,强烈建议您保持启用此设置。

您可以通过添加自己的 RedisCacheConfiguration 的@Bean来完全控制配置。如果您要定制序列化策略,这可能很有用。

11.1.8. Caffeine

Caffeine 是JAVA8重写Guava的缓存,取代了对Guava的支持。如果存在Caffeine,则会自动配置CaffeineCacheManager (由spring-boot-starter-cache的“starter”提供)。可以通过设置 spring.cache.cache-names 属性在启动时创建缓存,并且可以通过以下方式之一进行自定义(按指定顺序):

由spring.cache.caffeine.spec定义的缓存规范

定义了com.github.benmanes.caffeine.cache.CaffeineSpec的 bean

定义了com.github.benmanes.caffeine.cache.Caffeine的bean

例如,以下配置创建最大大小为500且生存时间为10分钟的cache1和cache2缓存

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

如果定义了 com.github.benmanes.caffeine.cache.CacheLoader的bean,它将自动与 CaffeineCacheManager关联。由于CacheLoader将与由缓存管理器管理的所有缓存关联,因此必须将其定义为CacheLoader<Object, Object>。自动配置忽略任何其他泛型类型。

11.1.9. 简单缓存

如果找不到任何其他提供程序,则Spring boot配置一个简单的实现,将使用ConcurrentHashMap作为缓存存储。如果应用程序中没有缓存库,则这是默认设置。默认情况下,将根据需要创建缓存,但可以通过设置 cache-names属性来限制可用缓存的列表。例如,如果只需要cache1和cache2缓存,请按以下方式设置 cache-names 属性:

spring.cache.cache-names=cache1,cache2

如果您这样做,并且您的应用程序使用了一个未列出的缓存,那么当需要缓存时,它会在运行时失败,但不会在启动时失败。这与使用未声明的缓存时“真实”缓存提供程序的行为类似。

11.1.10. None

当您的配置中存在@EnableCaching时,也需要合适的缓存配置。如果需要在某些环境中完全禁用缓存,请将缓存类型强制为none ,如下面的示例所示:

spring.cache.type=none

最近业余时间,翻译了Spring boot的几个官方文档,如果对你有用,可以移步去看:
1、官方入门文档
http://www.itmanclub.com/blog/article/39

2、官方spring-boot-features文档
2.1、Spring应用程序 http://www.itmanclub.com/blog/article/16
2.2、读取外部配置 http://www.itmanclub.com/blog/article/17
2.3、多环境配置 http://www.itmanclub.com/blog/article/18
2.4、日志配置 http://www.itmanclub.com/blog/article/19
2.5、国际化及JSON http://www.itmanclub.com/blog/article/20
2.6、开发Web应用程序
第一部分 http://www.itmanclub.com/blog/article/21
第二部分 http://www.itmanclub.com/blog/article/22
2.7、安全性 http://www.itmanclub.com/blog/article/24
2.8、使用SQL数据库 http://www.itmanclub.com/blog/article/25
2.9、与NoSQL技术关联 http://www.itmanclub.com/blog/article/26
2.10、Caching缓存 http://www.itmanclub.com/blog/article/27
2.11、消息队列 http://www.itmanclub.com/blog/index/28
2.12、调用REST服务的两种方法 http://www.itmanclub.com/blog/article/29
2.13、验证 http://www.itmanclub.com/blog/article/30#validation
2.14、邮件、http://www.itmanclub.com/blog/article/30#mail
2.15、分布式事务 http://www.itmanclub.com/blog/article/30#jta
2.16、Hazelcast http://www.itmanclub.com/blog/article/32#hazelcast
2.17、Quartz http://www.itmanclub.com/blog/article/32#quartz
2.18、任务执行和调度 http://www.itmanclub.com/blog/article/32#scheduling
2.19、Spring集成http://www.itmanclub.com/blog/article/33#integration
2.20、Spring会话 http://www.itmanclub.com/blog/article/33#session
2.21、JMX监控和管理http://www.itmanclub.com/blog/article/33#jmx
2.22、Springboot测试
第一部分 http://www.itmanclub.com/blog/article/34
第二部分http://www.itmanclub.com/blog/article/35
2.23、WebSocket http://www.itmanclub.com/blog/article/36#websockets
2.24、Web Services http://www.itmanclub.com/blog/article/36#webservices
2.25、创建你自己的自动配置http://www.itmanclub.com/blog/article/37
2.26、 Kotlin支持 http://www.itmanclub.com/blog/article/38

3.官方howto文档
3.1、Spring Boot 应用程序 http://www.itmanclub.com/blog/article/4
3.2、属性和配置 http://www.itmanclub.com/blog/article/5
3.3、嵌入式Web服务器 http://www.itmanclub.com/blog/article/6
3.4、SpringMVC http://www.itmanclub.com/blog/article/7
3.5、Security http://www.itmanclub.com/blog/article/8#security
3.6、Jersey http://www.itmanclub.com/blog/article/8#jersey
3.7、HTTP客户端 http://www.itmanclub.com/blog/article/8#http
3.8、日志 http://www.itmanclub.com/blog/article/9
3.1、数据库访问相关http://www.itmanclub.com/blog/article/10
3.9、数据库初始化 http://www.itmanclub.com/blog/article/11
3.10、 消息 http://www.itmanclub.com/blog/article/12#message
3.10、批处理 http://www.itmanclub.com/blog/article/12#batch
3.12、Actuator http://www.itmanclub.com/blog/article/12#actuator
3.13、安全 http://www.itmanclub.com/blog/article/13#secure
3.14、 热部署 http://www.itmanclub.com/blog/article/13#hotswapping
3.15、构建 http://www.itmanclub.com/blog/article/14
3.16、传统部署方法 http://www.itmanclub.com/blog/article/15

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值