SpringBoot 中文手册 --Part IV --31 缓存

来源:互联网 发布:c语言某一位取反 编辑:程序博客网 时间:2024/06/16 08:47

本文翻译自 https://docs.spring.io/spring-boot/docs/1.5.7.RELEASE/reference/htmlsingle/#boot-features-caching


31 缓存

Spring 框架为一个应用明显增加缓存提供支持。在它的核心中,抽象将缓存应用在方法上,通过基于缓存可获取的信息减少执行的次数。缓存逻辑应用透明,对调用没任何干扰。Spring Boot 自动配置缓存组件只要通过 @EnableCaching 注解开启缓存支持。

[Note]

查阅Spring框架参考的 关联章节 获取更多细节。


简言之,在你服务运用中加入缓存是极其简单的,只要增加相关注解到它的方法上:
import org.springframework.cache.annotation.Cacheableimport org.springframework.stereotype.Component;@Componentpublic class MathService {    @Cacheable("piDecimals")    public int computePiDecimal(int i) {        // ...    }}
这个例子展示了缓存在一个可能高运算上的应用。在调用computePiDecimal 之前,抽象将在 piDecimals 缓存中寻找入口匹配i 参数。如果任何入口被发现,缓存中的内容会立即返给调用者,方法将不再被调用。否则,调用方法后在值返回前更新缓存值。

[Note]

你也可明确得使用标准的 JSR-107 (JCache) 注解 (e.g. @CacheResult) 。我们强烈建议你无论如何不要混合和配合使用他们。


如果你没有指定任何缓存库,Spring Boot将自动配置 Simple provider,使用内存中并发映射。当一个缓存被请求时(例如上述例子中的 piDecimals ),提供者会为例立即创建。Simple provider真的不推荐在生产环境中使用,但它非常适合你来起步和明白这些特性。当你决定使用缓存提供器时,请确保阅读他的文档来明白你的应用使用的缓存如何配置。事实上,所有的供应商都要求你明确配置每一个你用在应用中的缓存。部分供应商通过 spring.cache.cache-names 属性提供了自定义默认缓存定义的方式。

[Tip]

明显的它也可以从缓存中 update 或 evict 数据

[Note]

如果你在非接口型的beans上使用缓存组件,确保开启 proxyTargetClass 的属性 @EnableCaching

31.1 支持的缓存供应商

缓存抽象不提供事实存储,信任于使用org.springframework.cache.Cache 和org.springframework.cache.CacheManager 接口的抽象实现。

如果你没有定义一个 CacheManager 类型的bean或一个名为cacheResolver 的 CacheResolver (见 CachingConfigurer ),Spring Boot将尝试发现下述供应商(按此顺序):

  • Generic
  • JCache (JSR-107) (EhCache 3, Hazelcast, Infinispan, etc)
  • EhCache 2.x
  • Hazelcast
  • Infinispan
  • Couchbase
  • Redis
  • Caffeine
  • Guava (deprecated)
  • Simple
[Tip]

通过 spring.cache.type 属性强制缓存提供者也是可能的,使用这个属性,你需要disable caching altogether 在某个环境(例如 测试)。

[Tip]

使用 spring-boot-starter-cache ‘Starter’ 可快速增加基本缓存依赖。 该 starter带入了 spring-context-support: 如果你手动增加依赖,你必须引入 spring-context-support 为了使用 JCache, EhCache 2.x 或 Guava 支持。

如果 CacheManager 被Spring Boot自动配置了,你可以在它完全初始化之前,通过暴露一个实现了 CacheManagerCustomizer 接口的bean来更进一步的调整它的配置。下面的例子设置一个标志标识空值应该被传递到表层。
@Beanpublic CacheManagerCustomizer<ConcurrentMapCacheManager> cacheManagerCustomizer() {    return new CacheManagerCustomizer<ConcurrentMapCacheManager>() {        @Override        public void customize(ConcurrentMapCacheManager cacheManager) {            cacheManager.setAllowNullValues(false);        }    };}

[Note]

在上述例子中,一个自动配置的 ConcurrentMapCacheManager 被期许。如果不是这种情况(要么提供了自己的配置要么自动配置不同的cache提供程序),自定义器不再被调用。你可以有很多你想要的定制,也可以整理他们像通常使用@Order or Ordered


31.1.1 Generic 

Generic 缓存被用在环境中至少定义了一个org.springframework.cache.Cachebean 。一个 CacheManager 会装载所有该
类型被创建的beans。

31.1.2  JCache(JSR-107)

JCache通过类路径存在的  javax.cache.spi.CachingProvider (即 兼容JSR-107的缓存库 )和由 spring-boot-starter-cache 
“Starter”提供的 JCacheCacheManager 来引导。市面上有很多兼容库,Spring Boot为Ehcache 3, Hazelcast 和Infinispan 提供了依赖管理。
任何其他兼容库也可以增加来使用。

多个提供者存在是可能的,此时必须明确的指定提供者。尽管JSR-107对配置文件位置定义没有统一的标准,但Spring Boot尽他

最大的努力来适应实现细节。

# Only necessary if more than one provider is presentspring.cache.jcache.provider=com.acme.MyCachingProviderspring.cache.jcache.config=classpath:acme.xml
[Note]

由于缓存库可能既提供原生实现也提供对JSR-107的支持。  Spring Boot 更愿意使用 JSR-107 支持,因为这相同的特性很方便在你切换到其他的JSR-107 实现上去。

[Tip]

Spring Boot 有 general support for Hazelcast. 如果唯一的 HazelcastInstance 可用,它将被 CacheManager 自动重复使用,除spring.cache.jcache.config 属性被指定。

这里有一些方式来定义下面的 javax.cache.cacheManager

  • Caches 可以通过 spring.cache.cache-names 属性在启动时被创建,. 如果自定义的javax.cache.configuration.Configuration bean 被定义,它将用于定义缓存。
  • org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizerbeans 被 CacheManager 的引用调用来获得完全的定制。
[Tip]

如果标准的 javax.cache.CacheManager bean 被定义了,它会被自动裹进抽象期望实现的 org.springframework.cache.CacheManager 实现类中。不再在它中进一步自定义了。


31.1.3  EhCache 2.x

EhCache 2.x 的使用需要在类路径的根下有一个名为 ehcache.xml 的文件。如果使用EhCache 2.x, EhCacheCacheManager 

将由 spring-boot-starter-cache‘Starter’ 提供,那个文件也会出现用于引导缓存管理器。一个替换的配置文件也可使用下面的

方式给出:

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

31.1.4   Hazelcast

Spring Boot 有general support for Hazelcast。如果 HazelcastInstance 已经被自动配置了,它会自动装载到 CacheManager.。

31.1.5 Infinispan 

Infinispan 没有默认的配置文件位置,所以需要明确指明(或者默认的引导器被使用)。
spring.cache.infinispan.config=infinispan.xml

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

[Note]

Infinispan在 Spring Boot中的支持是限制在内部模式且十分基础。如果你想要更多操作,你应使用正常的Infinispan Spring Boot 代替,查阅 the documentation 获得更多详情


31.1.6 Couchbase 

如果Couchbase Java客户端和 couchbase-spring-cache 的实现类可用,并且 Couchbase 被配置了,一个 CouchbaseCacheManager 将被自动配置。也可以通过 spring.cache.cache-names 属性在启动时创建额外的缓存。他们将影响自动配置的 Bucket 。你也可以使用定制器在另一个 Bucket 上创建额外的缓存:假设你需要两个缓存“主” Bucket 和一个 biz 带有自定义的2秒生存期的缓存在 another Bucket。首先,你可以简单地通过配置创建两个优先缓存:

spring.cache.cache-names=foo,bar
然后定义额外的 @Configuration 来配置另外的 Bucket 和  biz 缓存:

@Configurationpublic 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("biz", CacheBuilder.newInstance(anotherBucket())                    .withExpiration(2));        };    }}
样例配置再次用到通过自动配置创建的  Cluster 。


31.1.7 Redis

如果Redis可用并被配置, RedisCacheManager 是自动配置的。使用 spring.cache.cache-names 属性也可以在启动时创建其他的缓存。

[Note]

通常一个key前缀被增加来防止两个不同的缓存使用相同的KEY,导致Redis覆盖KEYs,返回不可用的值。我们强烈建议保持该设置开启在你创建自己的RedisCacheManager时。


31.1.8 Caffeine

Caffeine 是Guava缓存的JAVA 8重写版本,将替换Guava在Spring Boot 2.0 中的支持。如果Caffeine存在,
 CaffeineCacheManager (由spring-boot-starter-cache ‘Starter’提供)会被自动配置。缓存可以使用
 spring.cache.cache-names 属性在启动时创建,然后通过下列之一定制(按此顺序):

  1. 一个被 spring.cache.caffeine.spec 定义的缓存细则。
  2. 一个 com.github.benmanes.caffeine.cache.CaffeineSpec bean 被定义
  3. 一个 com.github.benmanes.caffeine.cache.Caffeine bean 被定义。
例如,下面的配置创建一个 foo 和 bar  最大容纳500个和10分钟有效期的缓存:
spring.cache.cache-names=foo,barspring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s
此外,如果一个 com.github.benmanes.caffeine.cache.CacheLoader bean被定义,它会自动关联到
 CaffeineCacheManager 。因为 CacheLoader 用来关联所有被缓存管理器管理的缓存,所以它必须定义为CacheLoader<Object, Object>。任何其他普通类型会被自动配置忽略。

31.1.9 Guava(不建议)

如果Guava存在,一个 GuavaCacheManager 会被自动配置。缓存可以使用 spring.cache.cache-names 属性在启动时创建并

通过下列之一定制(按此顺序):

  1. 一个被 spring.cache.guava.spec 定义的缓存细则。
  2. 一个 com.google.common.cache.CacheBuilderSpec bean 被定义
  3. 一个 com.google.common.cache.CacheBuilder bean 被定义。
例如,下面的配置创建一个最大容量500和10分钟有效期的  foo 和bar 缓存。
spring.cache.cache-names=foo,barspring.cache.guava.spec=maximumSize=500,expireAfterAccess=600s
此外,如果一个 com.google.common.cache.CacheLoader bean被定义,它会自动关联到
 GuavaCacheManager 。因为 CacheLoader 用来关联所有被缓存管理器管理的缓存,所以它必须定义为CacheLoader<Object, Object>。任何其他普通类型会被自动配置忽略。

31.1.10 简单的缓存

如果任何的提供器都未被找到,一个使用 ConcurrentHashMap 的简单实现会被配置为缓存存储。
如果在你的应用中没有缓存库时它将是默认的缓存。缓存默认会在过程中创建除非你通过使用cache-names 属性限制了可用的缓存列表。例如,你只想要 foo 和 bar 缓存:
spring.cache.cache-names=foo,bar
如果这样做了,并在你的应用中使用了未列出的缓存,它会在运行中当需要缓存但没有启动时失败。这和“真实”缓存提供器的你使用未声明的缓存时行为一致。

31.1.11 NONE

 @EnableCaching 存在在你的配置中时,合适的缓存配置也是期望的。如果你在某个环境完全的禁用缓存,强制缓存类型为 none 来使用无操作的实线。
spring.cache.type=none





原创粉丝点击