本地缓存——Caffeine Cache
一、介绍
Caffeine是基于JDK8的高性能本地缓存库,提供了几乎完美的命中率。它有点类似JDK中的ConcurrentMap,实际上,Caffeine中的LocalCache接口就是实现了JDK中的ConcurrentMap接口,但两者并不完全一样。 最大区别是caffeine有自动剔除策略,支持设置过期时间。
二、快速开始
2.1 引入依赖
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>2.9.3</version>
<scope>compile</scope>
</dependency>
2.2 新建配置类,配置缓存名称和过期时间等
package com.example.demo.config;
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.cache.CacheManager;
import org.springframework.cache.caffeine.CaffeineCache;
import org.springframework.cache.support.SimpleCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
@Configuration
public class CaffeineCacheConfig {
@Bean
public CacheManager cacheManager(){
SimpleCacheManager cacheManager = new SimpleCacheManager();
List<CaffeineCache> caches = new ArrayList<>();
caches.add(new CaffeineCache("CACHE1",
Caffeine.newBuilder().expireAfterWrite(5, TimeUnit.SECONDS).build()));
caches.add(new CaffeineCache("CACHE2",
Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build()));
cacheManager.setCaches(caches);
return cacheManager;
}
}
2.3 启动类增加注解开启缓存
@EnableCaching
2.4 使用类的方法上增加注解
@Override
@Cacheable(value = "CACHE2",key = "'#t1' + '_' + '#t2'")
public List<Test01Bean> a3(String t1,String t2){
System.out.println("first==begin");
List<Test01Bean> test01BeanList = new ArrayList<>();
Test01Bean test01Bean1 = new Test01Bean("a1","a2","a3","a4");
Test01Bean test01Bean2 = new Test01Bean("b1","b2","b3","b4");
Test01Bean test01Bean3 = new Test01Bean("c1","c2","c3","c4");
Test01Bean test01Bean4 = new Test01Bean("b1","b2","99","98");
test01BeanList.add(test01Bean1);
test01BeanList.add(test01Bean2);
test01BeanList.add(test01Bean3);
test01BeanList.add(test01Bean4);
System.out.println("first==end");
return test01BeanList.stream().filter(e->e.getA().equals(t1)).collect(Collectors.toList());
}
2.5 caffeine的参数设置
key | desc | others |
---|---|---|
initialCapacity | 缓存对象个数 | |
maximumSize | 最大容量 | 超过会触发异步线程清除 |
maximumWeight | 最大权重 | |
expireAfterAccess | 最后一次访问过期时间 | |
expireAfterWrite | 最后一次更新过期时间 | |
refreshAfterWrite | 延迟刷新 | 写操作完成后多久才将数据刷新进缓存中 |
注意点:
1、同个类内方法调用不生效,因为本质还是AOP代理类的模式。
2、结构类似map,如果某个key如果缓存和实际查询都是找不到的会返回null,在返回数据的处理时要注意空指针异常。