Caffeine Cache基础入门
Caffeine Cache 以其高性能和可扩展性赢得「 本地缓存之王 」的称号,它是一个 Java 缓存库。
Spring Boot 1.x 版本中的默认本地缓存是 Guava Cache。但在 Spring5 (SpringBoot 2.x)后,Spring 官方放弃了 Guava Cache 作为缓存机制,而是使用性能更优秀的 Caffeine 作为默认缓存组件。
Caffeine 官方测试报告:https://github.com/ben-manes/caffeine/wiki/Benchmarks-zh-CN
缓存介绍
Caffeine特点
1、自动将数据加载到缓存中,同时也可以采用异步的方式加载。
2、内存淘汰策略:基于频次、基于最近访问、最大容量。
3、根据上一次的缓存访问\上一次的数据写入决定缓存的过期的设置。
4、当一条缓存数据过期了,自动清理,清理的时候也是异步线程来做。
5、考虑JVM的内存管理机制,加入弱引用、软引用。
6、缓存数据被清理后,会收到相关的通知信息
7、缓存数据的写入可以传播到外部的存储。
8、统计功能:被访问次数,命中,清理的个数,加载个数
Caffeine Cache入门
官网地址:https://github.com/ben-manes/caffeine
Maven引入
<!-- Spring boot Cache-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!--for caffeine cache-->
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>2.7.0</version>
</dependency>
Cache是一个核心的接口,里面定义了很多方法,我们要使用缓存一般是使用Cache的的子类,根据官方的方法,我们通过caffeine这个类来获得实现Cache的类。
基本使用-简单
Cache是一个核心的接口,里面定义了很多方法,我们要使用缓存一般是使用Cache的的子类,根据官方的方法,我们通过caffeine这个类来获得实现Cache的类。
public static void Cache() throws Exception{
Cache<String, String> cache = Caffeine.newBuilder()//构建一个新的Caffeine实例
.maximumSize(100)//设置缓存中保存的最大数量
.expireAfterAccess(3L, TimeUnit.SECONDS)//如无访问则3秒后失效
.build();//构建Cache接口实例
cache.put("mca","www.mashibing.com");//设置缓存项
cache.put("baidu","www.baidu.com");//设置缓存项
cache.put("spring","www.spring.io");//设置缓存项
log.info("获取缓存[getIfPresent]:mca={}",cache.getIfPresent("mca"));//获取数据
TimeUnit.SECONDS.sleep(5);//休眠5秒
log.info("获取缓存[getIfPresent]:mca={}",cache.getIfPresent("mca"));//获取数据
}
最普通的一种缓存,无需指定加载方式,需要手动调用 put()
进行加载。需要注意的是,put()方法对于已存在的 key 将进行覆盖。如果这个值不存在,调用 getIfPresent()
方法,则会立即返回 null,不会被阻塞。
上面显示效果如下:
Caffeine 配置说明:
- initialCapacity=[integer]: 初始的缓存空间大小
- maximumSize=[long]: 缓存的最大条数,如果达到最大个数,默认会丢弃最早添加的
- maximumWeight=[long]: 缓存的最大权重
- expireAfterAccess=[duration]: 最后一次写入或访问后经过固定时间过期
- expireAfterWrite=[duration]: 最后一次写入后经过固定时间过期
- refreshAfterWrite=[duration]: 创建缓存或者最近一次更新缓存后经过固定的时间间隔,刷新缓存
- weakKeys: 打开 key 的弱引用
- weakValues:打开 value 的弱引用
- softValues:打开 value 的软引用
- recordStats:开发统计功能
基本使用-过期数据的同步加载1
有些时候当缓存数据失效的时候,我们可能希望拿到缓存的时候不返回一个null,可以进行一些数的处理,自定义的进行一些操作,这就要用到Cache接口的get方法,这个get方法里面可以实现一个函数式接口,让我们对数据进行自定义的处理:
public static void CacheExpire() throws Exception{
Cache<String, String> cache = Caffeine.newBuilder()//构建一个新的Caffeine实例
.maximumSize(100