Caffeine 是基于 JAVA 8 的高性能本地缓存库。并且在 spring5 (springboot 2.x) 后,spring 官方放弃了 Guava,而使用了性能更优秀的 Caffeine 作为默认缓存组件。
Caffeine是在Guava Cache的基础上做一层封装,性能有明显提高,二者同属于内存级本地缓存。使用Caffeine后无需使用Guava Cache,从并发的角度来讲,Caffeine明显优于Guava,原因是使用了Java 8最新的StampedLock锁技术。
本地缓存与分布式缓存对应,缓存进程和应用进程同属于一个JVM,数据的读、写在一个进程内完成。本地缓存没有网络开销,访问速度很快。
Caffeine提供灵活的结构来创建缓存,并且有以下特性:
导入pom依赖
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>2.6.2</version>
</dependency>
入门案例
// 构建cache对象
Cache<String, String> cache = Caffeine.newBuilder().build();
// 存数据
cache.put("k1", "v1");
// 取数据
String v1 = cache.getIfPresent("k1");
System.out.println("k1 = " + v1);
// 取数据,包含两个参数:
// 参数一:缓存的key
// 参数二:Lambda表达式,表达式参数就是缓存的key,方法体是查询数据库的逻辑
// 优先根据key查询JVM缓存,如果未命中,则执行参数二的Lambda表达式
String defaultkey = cache.get("k2", key -> {
// 根据key去数据库查询数据
return "v2";
});
System.out.println("k2 = " + defaultkey);
配置案例
public static LoadingCache<Long, User> loadingCache = Caffeine.newBuilder()
// 初始的缓存空间大小
.initialCapacity(5)
// 缓存的最大条数
.maximumSize(10)
.expireAfterWrite(4, TimeUnit.SECONDS)
.expireAfterAccess(10, TimeUnit.SECONDS)
.refreshAfterWrite(6, TimeUnit.SECONDS)
.recordStats()
//设置缓存的移除通知
.removalListener(new RemovalListener<Long, User>() {
@Override
public void onRemoval(@Nullable Long key, @Nullable User user, @NonNull RemovalCause removalCause) {
System.out.printf("Key: %s ,值:%s was removed!原因 (%s) \n", key, user, removalCause);
}
})
.build(id -> {
System.out.println("缓存未命中,从数据库加载,用户id:" + id);
return User.builder().id(id).userName("Lily").age(new Random().nextInt(20)).build();
});
参数说明:
Caffeine提供了三种缓存驱逐策略:
基于容量:设置缓存的数量上限
// 创建缓存对象
Cache<String, String> cache = Caffeine.newBuilder()
.maximumSize(1) // 设置缓存大小上限为 1
.build();
基于时间:设置缓存的有效时间
// 创建缓存对象
Cache<String, String> cache = Caffeine.newBuilder()
// 设置缓存有效期为 10 秒,从最后一次写入开始计时
.expireAfterWrite(Duration.ofSeconds(10))
.build();
基于引用:设置缓存为软引用或弱引用,利用GC来回收缓存数据。性能较差,不建议使用。
// 构建cache对象
Cache<String, String> cache = Caffeine.newBuilder()
.weakKeys().weakValues().build();
Caffeine.weakKeys() 使用弱引用存储key。如果没有强引用这个key,则GC时允许回收该条目 Caffeine.weakValues() 使用弱引用存储value。如果没有强引用这个value,则GC时允许回收该条目 Caffeine.softValues() 使用软引用存储value, 如果没有强引用这个value,则GC内存不足时允许回收该条目
引用类型 | 被垃圾回收时间 | 用途 | 生存时间 |
---|---|---|---|
强引用 | 从来不会 | 对象的一般状态 | JVM停止运行时终止 |
软引用 | 在内存不足时 | 对象缓存 | 内存不足时终止 |
弱引用 | 在垃圾回收时 | 对象缓存 | gc运行后终止 |
虚引用 | Unknown | Unknown | Unknown |
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。