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 缓存
@EnableCaching
注解开启缓存支持。查阅Spring框架参考的 关联章节 获取更多细节。
import org.springframework.cache.annotation.Cacheableimport org.springframework.stereotype.Component;@Componentpublic class MathService { @Cacheable("piDecimals") public int computePiDecimal(int i) { // ... }}
这个例子展示了缓存在一个可能高运算上的应用。在调用computePiDecimal
之前,抽象将在 piDecimals
缓存中寻找入口匹配i
参数。如果任何入口被发现,缓存中的内容会立即返给调用者,方法将不再被调用。否则,调用方法后在值返回前更新缓存值。你也可明确得使用标准的 JSR-107 (JCache) 注解 (e.g. @CacheResult
) 。我们强烈建议你无论如何不要混合和配合使用他们。
piDecimals
),提供者会为例立即创建。Simple provider真的不推荐在生产环境中使用,但它非常适合你来起步和明白这些特性。当你决定使用缓存提供器时,请确保阅读他的文档来明白你的应用使用的缓存如何配置。事实上,所有的供应商都要求你明确配置每一个你用在应用中的缓存。部分供应商通过 spring.cache.cache-names
属性提供了自定义默认缓存定义的方式。明显的它也可以从缓存中 update 或 evict 数据
如果你在非接口型的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
通过 spring.cache.type
属性强制缓存提供者也是可能的,使用这个属性,你需要disable caching altogether 在某个环境(例如 测试)。
使用 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); } };}
在上述例子中,一个自动配置的 ConcurrentMapCacheManager
被期许。如果不是这种情况(要么提供了自己的配置要么自动配置不同的cache提供程序),自定义器不再被调用。你可以有很多你想要的定制,也可以整理他们像通常使用@Order
or Ordered
。
31.1.1 Generic
org.springframework.cache.Cache
bean 。一个 CacheManager
会装载所有该31.1.2 JCache(JSR-107)
javax.cache.spi.CachingProvider
(即 兼容JSR-107的缓存库 )和由 spring-boot-starter-cache
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
由于缓存库可能既提供原生实现也提供对JSR-107的支持。 Spring Boot 更愿意使用 JSR-107 支持,因为这相同的特性很方便在你切换到其他的JSR-107 实现上去。
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.JCacheManagerCustomizer
beans 被CacheManager
的引用调用来获得完全的定制。
如果标准的 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
HazelcastInstance
已经被自动配置了,它会自动装载到 CacheManager
.。31.1.5 Infinispan
spring.cache.infinispan.config=infinispan.xml
spring.cache.cache-names
属性在启动时被创建。如果自定义了ConfigurationBuilder
bean,它将用来定义缓存。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
RedisCacheManager
是自动配置的。使用 spring.cache.cache-names
属性也可以在启动时创建其他的缓存。通常一个key前缀被增加来防止两个不同的缓存使用相同的KEY,导致Redis覆盖KEYs,返回不可用的值。我们强烈建议保持该设置开启在你创建自己的RedisCacheManager
时。
31.1.8 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 被定义。
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
属性在启动时创建并
通过下列之一定制(按此顺序):
- 一个被
spring.cache.guava.spec
定义的缓存细则。 - 一个
com.google.common.cache.CacheBuilderSpec
bean 被定义 - 一个
com.google.common.cache.CacheBuilder
bean 被定义。
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
- SpringBoot 中文手册 --Part IV --31 缓存
- SpringBoot 中文手册 --Part IV --27
- SpringBoot 中文手册 --Part IV --28 安全
- SpringBoot 中文手册 --Part IV --32 消息
- SpringBoot 中文手册 --Part IV --34 验证
- SpringBoot 中文手册 --Part IV --37-40
- SpringBoot 中文手册 --Part IV --41 测试
- SpringBoot 中文手册 --Part IV --29 使用SQL数据库
- SpringBoot 中文手册 --Part IV --30 使用NoSQL技术
- SpringBoot 中文手册 --Part IV --33 调用REST服务
- SpringBoot 中文手册 --Part IV --35 发送邮件
- SpringBoot 中文手册 --Part IV --36 用JTA进行分布式事务
- nginx 中文手册——part one
- Eiffel 引介 Part IV
- Eiffel 引介 Part IV (1)
- Delphi对象模型(Part IV)
- LESSON 6 MALWARE part IV
- The Wavelet Tutorial Part IV
- 如何编辑PDF文件内容才好?这个方法你要收藏了
- AutoCompleteTextView 输入框自动提示 记录小结
- 最大连续字串和
- 数组
- oj网站的训练题:C基础-公约公倍
- SpringBoot 中文手册 --Part IV --31 缓存
- MapReduce 分组GroupingComparator
- C# Quartz(编码实现定时任务), 干货
- 16.1 字符集与 HTTP
- 关于全选和全部选及个别操作
- H5-Doctype作用
- jdbc进行简单的增删查改(statement)
- react-native的PanResponder详解研究
- 最简单的C++反射