Caffeine缓存
Caffeine缓存
Caffeine是一个基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库。目前Spring内部的缓存使用的就是Caffeine。GitHub地址:https://github.com/ben-manes/caffeine
设置SpringBoot父工程时,可直接添加依赖:
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
基本用法:
Logger log = LoggerFactory.getLogger(CaffeineTest.class);
/**
* 基本用法测试
*/
@Test
public void create() {
// 创建缓存对象
Cache<String, String> cache = Caffeine.newBuilder().build();
// 存数据
cache.put("username", "aaaa");
// 取数据,不存在则返回null
String username = cache.getIfPresent("username");
log.info("username: {}", username);
// 取数据,不存在则去数据库查询
String age = cache.get("age", key -> {
// 这里可以去数据库根据 key查询value
return "11";
});
log.info("age: {}", age);
}
Caffeine提供了三种缓存驱逐策略:
- 基于容量:设置缓存的数量上限
/**
* 基于大小设置驱逐策略:
* @throws InterruptedException e
*/
@Test
public void evictByNum() throws InterruptedException {
// 创建缓存大小上限为1
Cache<String, String> cache = Caffeine.newBuilder()
// 设置缓存大小上限为 1
.maximumSize(1)
.build();
// 存数据
cache.put("gf1", "柳岩");
cache.put("gf2", "范冰冰");
cache.put("gf3", "迪丽热巴");
log.info("start");
// 延迟10ms,给清理线程一点时间
Thread.sleep(100L);
// 获取数据
log.info("gf1: " + cache.getIfPresent("gf1"));
log.info("gf2: " + cache.getIfPresent("gf2"));
log.info("gf3: " + cache.getIfPresent("gf3"));
}
- 基于时间:设置缓存的有效时间
/**
* 基于时间设置驱逐策略
*/
@Test
public void evictByTime() throws InterruptedException {
// 创建缓存对象
Cache<String, String> cache = Caffeine.newBuilder()
.expireAfterWrite(Duration.ofSeconds(1))// 设置缓存有效期为 1 秒
.build();
// 存数据
cache.put("gf", "柳岩");
// 获取数据
log.info("gf: " + cache.getIfPresent("gf"));
// 休眠一会儿
Thread.sleep(1200L);
log.info("gf: " + cache.getIfPresent("gf"));
}
- 基于引用:设置缓存为软引用或弱引用,利用GC来回收缓存数据。性能较差,不建议使用。
在默认情况下,当一个缓存元素过期的时候,Caffeine不会自动立即将其清理和驱逐。而是在一次读或写操作后,或者在空闲时间完成对失效数据的驱逐。