SpringBoot引入Caffeine缓存配置
一般在项目中使用Redis作为分布式缓存,但是还有有很多场景需要使用本地缓存,存储一些热点缓存数据等,目前Spring支持很多本地缓存框架,如ehcache,caffeine,jcache等,不过目前guava cache已经不在spring的默认支持中了。
Caffeine介绍
Caffeine是一个基于Java8开发的提供了近乎最佳命中率的高性能的缓存库。
缓存和ConcurrentMap
有点相似,但还是有所区别。最根本的区别是ConcurrentMap
将会持有所有加入到缓存当中的元素,直到它们被从缓存当中手动移除。但是,Caffeine的缓存Cache
通常会被配置成自动驱逐缓存中元素,以限制其内存占用。在某些场景下,LoadingCache
和AsyncLoadingCache
因为其自动加载缓存的能力将会变得非常实用。
Caffeine地址:
https://github.com/ben-manes/caffeine
文档地址:https://github.com/ben-manes/caffeine/wiki/Home-zh-CN
引入依赖
使用maven引入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
默认使用的是
// 引入依賴之後可以自动配置
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration
org.springframework.boot.autoconfigure.cache.CaffeineCacheConfiguration
开启cache,需要使用注解@EnableCaching
来开启cache:
@SpringBootApplication
@EnableCaching
public class SimpleApplication {
public static void main(String[] args) {
SpringApplication.run(SimpleApplication.class, args);
}
}
在需要使用cache的地方添加
@Cacheable(cacheNames = "dobanBook", sync = true)
public BookVo loadBook(String bookUrl) {
// 实际业务逻辑
}
配置Caffeine
默认情况下,Caffeine不需要在application.yml中配置,但是要详细控制缓存时间,失效策略等,就需要配置Caffeine了。
Caffeine配置参数:
属性 | 类型 | 说明 |
---|---|---|
initalCapacity | integer | 初始空间大小 |
maximumSize | long | 缓存最大条数 |
maximumWeight | long | 缓存的最大权重 |
expireAfterAccess | duration | 最后一次写入或访问后经过固定时间过期 |
expireAfterWrite | duration | 最后一次写入后经过固定时间过期 |
refreshAfterWrite | duration | 创建缓存或者最近一次更新缓存后经过固定的时间间隔,刷新缓存 |
weakKeys | boolean | 打开key的弱引用(不要使用,默认比较使用==,重复key可能多次缓存) |
weakValues | boolean | 打开value的弱引用 |
softValues | boolean | 打开value的软引用 |
recordStats | boolean | 开发统计功能 |
持续时间可以通过在一个integer类型之后跟上一个"d","h","m",或者"s"来分别表示天,小时,分钟或者秒。另外,ISO-8601标准的字符串也被支持来配置持续时间,并通过Duration.parse来进行解析。出于表示缓存持续时间的目的,这里不支持配置负的持续时间,并将会抛出异常。两种持续时间表示格式的示例如下所示。
普通 | ISO-8601 | 描述 |
---|---|---|
50s | PT50S | 50秒 |
11m | PT11M | 11分钟 |
6h | PT6H | 6小时 |
3d | P3D | 3天 |
P3DT3H4M | 3天3小时4分钟 | |
-PT7H3M | -7小时,-3分钟(不支持) |
默认情况下,不做什么配置,在使用@Cacheable的时候会动态创建CaffeineCache,在CaffeineCacheManager里面有相关代码片段:
@Override
@Nullable
public Cache getCache(String name) {
return this.cacheMap.computeIfAbsent(name, cacheName -> this.dynamic ? createCaffeineCache(cacheName) : null);
}
protected Cache createCaffeineCache(String name) {
return adaptCaffeineCache(name, createNativeCaffeineCache(name));
}
protected com.github.benmanes.caffeine.cache.Cache<Object, Object> createNativeCaffeineCache(String name) {
return (this.cacheLoader != null ? this.cacheBuilder.build(this.cacheLoader) : this.cacheBuilder.build());
}
yml中配置
caffeine和ehcache等不一样,默认是没有配置文件的,不能指定配置文件路径,只可以在yml中配置,格式如下:
key1=value1,key2=value2,booleanValue
spring:
cache:
caffeine:
spec: maximumSize=500,expireAfterWrite=24h,weakValues