Caffeine是一种高性能的缓存库,是基于Java8的最佳(最优)缓存框架。
Cache(缓存),基于GoogleGuava,Caffeine提供一个内存缓存,大大改善了设计Guava'scache和ConcurrentlinkedHashMap的体验。
缓存类似于ConcurrentMap,但二者并不完全相同。最基本的区别是,ConcurrentMap保存添加到其中的所有元素,直到显式地删除它们。另一方面,缓存通常配置为自动删除条目,以限制其内存占用。在某些情况下,LoadingCache或AsyncLoadingCache可能很有用,因为它是自动缓存加载的。
Caffeine提供了灵活的结构来创建缓存,并且有以下特性:
自动加载条目到缓存中,可选异步方式
可以基于大小剔除
可以设置过期时间,时间可以从上次访问或上次写入开始计算
异步刷新
keys自动包装在弱引用中
values自动包装在弱引用或软引用中
条目剔除通知
缓存访问统计
1.加载/填充
Caffeine提供以下四种类型的加载策略:
1.1.Manual
Cache接口可以显式地控制检索、更新和删除条目。
1.2.Loading
LoadingCache通过关联一个CacheLoader来构建Cache
通过LoadingCache的getAll方法,可以批量查询
1.3.Asynchronous(Manual)
AsyncCache是另一种Cache,它基于Executor计算条目,并返回一个CompletableFuture。
1.4.AsynchronouslyLoading
AsyncLoadingCache是关联了AsyncCacheLoader的AsyncCache
2.剔除
Caffeine提供三种剔除方式:基于大小、基于时间、基于引用
2.1.Size-based
如果缓存的条目数量不应该超过某个值,那么可以使用Caffeine.maximumSize(long)。如果超过这个值,则会剔除很久没有被访问过或者不经常使用的那个条目。
如果,不同的条目有不同的权重值的话,那么你可以用Caffeine.weigher(Weigher)来指定一个权重函数,并且使用Caffeine.maximumWeight(long)来设定最大的权重值。
简单的来说,要么限制缓存条目的数量,要么限制缓存条目的权重值,二者取其一。限制数量很好理解,限制权重的话首先你得提供一个函数来设定每个条目的权重值是多少,然后才能显示最大的权重是多少。
2.2.Time-based
expireAfterAccess(long,TimeUnit):最后一次被访问(读或者写)后多久失效
expireAfterWrite(long,TimeUnit):最后一次被创建或修改后多久失效
expireAfter(Expiry):创建后多久失效
建议,主动维护缓存中条目,而不是等到访问的时候发现缓存条目已经失效了才去重新加载。意思就是,提前加载,定期维护。
可以在构建的时候Caffeine.scheduler(Scheduler)来指定调度线程
2.3.Reference-based
Caffeine.weakKeys()使用弱引用存储key。如果没有强引用这个key,则允许垃圾回收器回收该条目。注意,这是使用==判断key的。
Caffeine.weakValues()使用弱引用存储value。如果没有强引用这个value,则允许垃圾回收器回收该条目。注意,这是使用==判断key的。
Caffeine.softValues()使用软引用存储value。
3.删除
术语:
eviction指受策略影响而被删除
invalidation值被调用者手动删除
removal值因eviction或invalidation而发生的一种行为
3.1.明确地删除
3.2.监听器
4.刷新
通过LoadingCache.refresh(K)进行异步刷新,通过覆盖CacheLoader.reload(K,V)可以自定义刷新逻辑
5.统计
使用Caffeine.recordStats(),你可以打开统计功能。Cache.stats()方法会返回一个CacheStats对象,该对象提供以下统计信息:
hitRate():命中率
evictionCount():被剔除的条目数量
averageLoadPenalty():加载新值所花费的平均时间
6.示例
终于要说到重点了
一般来讲,用Redis作为一级话缓存,Caffeine作为二级缓存
6.1.示例一:单独使用
pom.xml
config
service
补充一点:你都用本地缓存了,必定已经用了一级缓存了。一级缓存无法达到预期的性能,才会选择用本地缓存。
controller
application.yml
service
用注解方便是方便,但是不好控制,还是自定义的好
7.工程结构
完整的pom.xml
以上就是深圳达内教育Java培训机构小编介绍的“java缓存框架教程,Caffeine内存缓存框架”的内容,希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为你服务。
相关内容
深入浅出的Java学习路径,Java练手项目学习
新手Java的三大框架ssh学习
JavaSSH框架教学视频