CaffeineCache Api介绍以及与Guava Cache性能对比| 京东物流技术团队
一、简单介绍:
CaffeineCache和Guava的Cache是应用广泛的本地缓存。
在开发中,为了达到降低依赖、提高访问速度的目的。会使用它存储一些维表接口的返回值和数据库查询结果,在有些场景下也会在分布式缓存上再加上一层本地缓存,用来减少对远程服务和数据库的请求次数。
CaffeineCache是以Guava Cache为原型库开发和扩展的一种本地缓存,并且适配Guava Cache的Api,但是CaffeineCache的性能更好。
二、CaffeineCache的使用:
CaffeineCache官方介绍有提供一些例子,不过这些例子不能直接运行。
下面围绕比较常用的API介绍下CaffeineCache的使用,列举一些可直接执行的Demo,看起来明了一些。
1.存数据:
Caffeine提供了四种缓存添加策略:手动加载,自动加载,手动异步加载和自动异步加载。
1.1手动加载:
Cache<String, String> cache = Caffeine.newBuilder()
//过期时间
.expireAfterWrite(10, TimeUnit.MINUTES)
//最大容量
.maximumSize(10_000)
.build();
String key = "test";
// 查找一个缓存元素, 没有查找到的时候返回null
String res = cache.get(key, k -> createValue(key));
// 添加或者更新一个缓存元素
cache.put(key, "testValue");
// 移除一个缓存元素
cache.invalidate(key);
}
// 模拟从外部数据源加载数据的逻辑
static String createValue(String key) {
return "value";
}
推荐使用 get(K var1, Function<? super K, ? extends V> var2);
get方法可以在缓存中不存在该key对应的值时进行计算,生成并直接写入至缓存内,最后将结果返回,而当该key对应的值存在时将会直接返回值。
注意到createValue方法有可能会出现异常,根据官网所说:“当缓存的元素无法生成或者在生成的过程中抛出异常而导致生成元素失败,cache.get 也许会返回 null ”,那么实际情况怎么样呢?我们来试一下。
public class TestCaffeineCache {
public static void main(String[] args) {
Cache<String, String> cache = Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.maximumSize(10_000)
.build();
String key = "test";
String res = cache.get(key, k -> createValue(key));
System.out.println(res);
}
// 模拟从外部数据源加载数据的逻辑
static String createValue(String key) {
//模拟异常情况
int a = 1/0;