工程代码:https://github.com/huiyiwu/spring-boot-simple/spring-boot-data-redis
参考文章:Spring Boot Redis Cache
针对于缓存,只整理了关于Redis的使用,其他缓存提供程序未用代码实现
文章目录
Spring Framework支持向应用程序添加缓存。从本质上讲,抽象将缓存应用于方法,从而根据缓存中可用的信息减少执行次数。缓存逻辑应用透明,不会对调用者造成任何干扰。只要通过@EnableCaching注释启用了缓存支持,Spring Boot就会自动配置缓存基础结构。
示例:
@Component
public class MathService {
@Cacheable("piDecimals")
public int computePiDecimal(int i) {
// ...
}
}
如果有与参数匹配的数据,则返回缓存的数据;如果没有,则调用方法,并在返回值之前更新缓存。
1. 支持的缓存提供程序
未定义CacheManager
的bean或名为cacheResolver
的CacheResolver时,Spring Boot会按照顺序检测提供者:
- Generic
- JCache(JSR-107)(Ehche3,Hazelcast,Infinishpan等)
- Ehche 2.x
- Hazelcast
- Infinispan
- Couchbase
- Redis
- Caffeine
- Simple
通过spring.cache.type
属性指定特定的缓存提供程序。
可以通过CacheManagerCustomizer
接口的bean在完全初始化之前调整其配置:
2. Generic(通用)
如果定义至少一个org.springframework.cache.Cache
,则使用了Generic缓存。创建了包含该类型的所有beans的CacheManager
。
3. JCache
JCache通过类路径上的javax.cache.spi.CacheingProvider
进行自举,由spring-boot-starter-cache
提供。
可以使用属性明确指定提供程序及定义配置文件的位置:
spring:
cache:
jcache:
provider: com.huchx.MyProvider
config: classpath:acme.xml
自定义基础javax.cache.cacheManager
:
- 通过设置
spring.cache.cacha-names
属性在启动时创建缓存,如果定义了自定义javax.cache.configuration.Configuration
bean,则会使用其来自定义CacheManager; - 使用
org.spring.framework.boot.autoconfigure.cache.JCacheManagerCustomizer
beans来完全自定义
4. EhCache 2.x
如果在类路径中的根目录中找到名为ehcache.xml
的文件,则使用EhCache 2.x,此时使用EhCacheManager
用于引导缓存管理器。也可以提供备用配置文件:
spring:
cache:
ehcache:
config: classpath:config/another-config.xml
5. Hazelcast
如果已经配置HazelcastInstance
,则会自动将其包装在CacheManager
中。
6. Infinispan
Infinispan没有默认配置文件位置,需要明确指定,否则使用默认引导程序:
spring:
cache:
infinispan:
config: infinispan.xml
可以通过spring.cache.cache-names
属性在启动时创建缓存。如果定义了自定义ConfigurationBuilder
bean,则用于自定义缓存。
7. Couchbase
如果Couchbase Java Client和couchbase-spring-cache
实现可用并且已配置Couchbase,则会自动配置CouchbaseCacheManager
.
可以spring.cache.cache-names
在启动时创建其他缓存。
示例:设置两个缓存cache1,cache2
spring:
cache:
cache-names: cache1,cache2
然后可以定义@Configuration
类来配置额外的缓存:
@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));
};
}
}
8. Redis
如果Redis可用且已配置,则会自动配置RedisManager
。
通过设置spring.cache.cache-names
在启动时创建内存,并且可以使用spring.cache.redis.*
属性配置缓存默认值。
示例:
spring:
cache:
cache-names:cache1,cache2
redis:
time-out-live: 60000
9. Caffeine
Caffeine是Java 8重写的Guava缓存,取代了对Guava的支持。如果设置Caffeine,则自动配置CaffeineCacheManager
。
可以通过设置spring.cache.cache-names
属性在启动时创建缓存,并且可以通过以下方式之一自定义缓存:
- 由
spring.cache.caffeine.spec
规范定义的缓存 - 自定义
com.github.benmanes.caffeine.cache.CaffeineSpec
bean - 自定义
com.github.benanes.caffeine.cache.Caffeine
bean
如果自定义com.github.benmanes.caffeine.cache.CacheLoader
bean,其将自动与CaffeineCacheManager
关联,由于CacheLoader
将于缓存管理器管理的所有缓存关联,必须将其定义为Cacheloader<Object,Object>
.
10. Simple
如果找不到其他应用程序,则配置默认使用ConcurrentHasMap
作为缓存存储的简单实现
通过cache-names设置可用缓存列表,如只要cache1,cache2:
spring:
cache:
cache-name:cache1,cache2
11. None
当配置中存在@EnableCaching时需要合适的缓存配置。设置spring.cache.type=none
完全禁用缓存