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/