SpringBoot引入Caffeine缓存配置

SpringBoot引入Caffeine缓存配置

一般在项目中使用Redis作为分布式缓存,但是还有有很多场景需要使用本地缓存,存储一些热点缓存数据等,目前Spring支持很多本地缓存框架,如ehcache,caffeine,jcache等,不过目前guava cache已经不在spring的默认支持中了。

image-20210828101536155

Caffeine介绍

Caffeine是一个基于Java8开发的提供了近乎最佳命中率的高性能的缓存库。

缓存和ConcurrentMap有点相似,但还是有所区别。最根本的区别是ConcurrentMap将会持有所有加入到缓存当中的元素,直到它们被从缓存当中手动移除。但是,Caffeine的缓存Cache 通常会被配置成自动驱逐缓存中元素,以限制其内存占用。在某些场景下,LoadingCacheAsyncLoadingCache 因为其自动加载缓存的能力将会变得非常实用。

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
上一篇
下一篇