guava cache使用记录

一、创建cache对象

创建cache对象一般有两种写法,一种返回cache对象,一种返回loadingCache对象

 

 

 loadingCache继承cache,也意味这cache的能力loadingcache都有,分别看一下两者的api:

cahce:https://guava.dev/releases/21.0/api/docs/com/google/common/cache/Cache.html

LoadingCache:https://guava.dev/releases/21.0/api/docs/com/google/common/cache/LoadingCache.html

建议使用loadingCache,两者api简单对比:

1、LoadingCache#get(K key) 和 Cache.get(K key, CacheLoader<? super K, V> loader)  最终调用同一个方法,两者的效果是一致的

但是Cache不能设置refreshAfterWrite,当数据过期时,会阻塞线程,具体可以参考后面   过期策略与刷新策略是如何配置使用的

二、参数配置,包括过期策略、 刷新策略、容量信息

容量配置根据实际场景来指定大小,建议指定初始容量,扩容操作是一个耗费资源的操作,guava根据设置的容量信息,当容量满时采用lru的淘汰策略就key淘汰,下面主要看一下过期策略和刷新策略

1、过期策略

expireAfterWrite:写后多长时间过期

expireAfterAccess:读后多长时间过期

guava cache并不是采用另启线程将key过期的策略,而是在使用过程中再将key过期

2、刷新策略

refreshAfterWrite:写后多久刷新一次    该方法只能loadingCache使用  Cache使用会抛异常

3、过期策略与刷新策略是如何配置使用的

 

 

下面再看一下刷新策略流程:

 整个流程:

 

 

 依次分析LoadingCache各种使用场景可能存在的问题:

一、只配置了过期时间,未配置刷新策略    当key过期时会导致所有请求这个key的线程阻塞

二、配置了过期时间,配置了刷新策略,但是未重写CacheLoader中reload()方法   当key过期时 会阻塞第一个load的线程,其他线程返回旧指

三、配置了过期时间 配置了刷新策略  并且重写了reload()方法,当key过期时   所有线程都返回旧值,另外启动一个后台线程刷新缓存

注意事项:load()方法不能返回为null,当get时会抛异常

参考文章:https://albenw.github.io/posts/df42dc84/

 

posted on 2022-11-19 18:19  努力学习的菜鸡  阅读(91)  评论(0编辑  收藏  举报

导航