概述
Caffeine是一个基于Java 8的高性能缓存库,提供了近似最优的命中率。Caffeine类似ConcurrentMap但又很不一样,最本质的区别是ConcurrentMap的元素需要手动删除,而cache需要根据某种规则自动清除元素。
Caffeine主要特性:
自动加载元素到cache中,包含异步加载
基于数量的清除规则
基于时间的过期规则,从最后读或者最后写开始计时
异步刷新
Key自动封装为弱引用(weak references)
Value自动封装为弱引用或软引用(weak or soft references)
元素被清除时通知
读或写可以传播到外部资源,比如写Cache然后写db
Cache 统计,包含命中率,清除数和元素加载耗时
1、Cache的填充
手动填充
Cache cache = Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.maximumSize(10_000)
.build();
Graph graph = cache.getIfPresent(key);
graph = cache.get(key, k -> createExpensiveGraph(key));
cache.put(key, graph);
cache.invalidate(key);
同步加载
LoadingCache cache = Caffeine.newBuilder()
.maximumSize(10_000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build(key -> createExpensiveGraph(key));
Graph graph = cache.get(key);
Map graphs = cache.getAll(keys);
异步加载
AsyncLoadingCache cache = Caffeine.newBuilder()
.maximumSize(10_000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.buildAsync(key -> createExpensiveGraph(key));
CompletableFuture graph = cache.get(key);
CompletableFuture> graphs = cache.getAll(keys);
2、清除策略
基于数量,当超过最大个数限制时把最少使用或者最久没有使用清除
基于时间,可以设置清除距离最近一次读或写超过多长时间的元素
3、cache的删除
cache的删除(invalidate)和清除(eviction)的区别是,删除时调用出显示删掉,清除时cache根据某种策略自动删掉。
cache.invalidate(key)
cache.invalidateAll(keys)
cache.invalidateAll()
4、cache的刷新
cache的刷新指的是重新加载cache里面元素新的值,在异步加载过程中,如果获取cache会返回旧的时,直到加载完毕才返回新的值。
cache的刷新适用于需要定时刷新并加入cache的场景,比如榜单。
5、cache的存储或二级缓存
LoadingCache graphs = Caffeine.newBuilder()
.writer(new CacheWriter() {
@Override public void write(Key key, Graph graph) {
// 写入存储或者二级缓存
}
@Override public void delete(Key key, Graph graph, RemovalCause cause) {
// 从存储删除或者从二级缓存删除
}
})
.build(key -> createExpensiveGraph(key));
6、扩展
Caffeine提供JCache和Guava扩展
7、性能评测
读(75%)/写(25%)时
https://github.com/ben-manes/caffeine
最后
以上就是敏感钢笔为你收集整理的caffeine java1.7_Caffeine高性能命中率近似最优的Java缓存库的全部内容,希望文章能够帮你解决caffeine java1.7_Caffeine高性能命中率近似最优的Java缓存库所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复