Caffeine缓存简介说明
下文笔者讲述一个非常有用的本地缓存库Caffeine,目前已应用于Spring框架中
Caffeine缓存库简介
Caffeine 是 基于Java8的高性能 接近最佳的缓存库 Caffeine目前在Spring内部中有使用 Caffeine的GitHub地址为:github.com/ben-manes/caffeine
Caffeine缓存库的使用方法
//引入依赖
<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", "java265.com");
// 取数据,不存在则返回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("username1", "java265");
cache.put("username2", "test");
cache.put("username3", "最爱java");
log.info("start");
// 延迟10ms,给清理线程一点时间
Thread.sleep(100L);
// 获取数据
log.info("gf1: " + cache.getIfPresent("username1"));
log.info("gf2: " + cache.getIfPresent("username2"));
log.info("gf3: " + cache.getIfPresent("username3"));
}
基于时间:设置缓存的有效时间
/**
* 基于时间设置驱逐策略
*/
@Test
public void evictByTime() throws InterruptedException {
// 创建缓存对象
Cache<String, String> cache = Caffeine.newBuilder()
.expireAfterWrite(Duration.ofSeconds(1))// 设置缓存有效期为 1 秒
.build();
// 存数据
cache.put("username", "java265");
// 获取数据
log.info("gf: " + cache.getIfPresent("username"));
// 休眠一会儿
Thread.sleep(1200L);
log.info("gf: " + cache.getIfPresent("username"));
}
基于引用:
设置缓存为软引用或弱引用
利用GC来回收缓存数据
此种方式性能较差,不建议使用
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


