本地缓存guava cache的过期策略与刷新策略

一、过期策略expireAfterWrite:当缓存项在指定的时间段内没有更新就会被回收。

  当达到过期时间,缓存值被置为Null,限制只有1个用户线程去执行新值的加载,其他请求必须阻塞等待这个加载操作完成。在加载完成之后,其他请求的线程会逐一获得锁,去判断是否已被加载完成,每个线程必须轮流地走一个“”获得锁,获得值,释放锁“”的过程,这样性能会有一些损耗。频繁的过期和加载,锁等待等过程会让性能有较大的损耗。

二、刷新策略refreshAfterWrite:当缓存项上一次更新操作之后的多久会被刷新。

  在refresh的过程中,限制只有1个请求线程进行重新加载操作,也可开线程异步获取新值,所有请求都暂时返回旧值。如果只是重写load()则是某个请求线程加载新值,如果重写了reload()则是异步加载新值,而其他查询先返回旧值,这样有效地可以减少等待和锁争用,所以refreshAfterWrite会比expireAfterWrite性能好。
  但是它也有一个缺点,因为到达指定时间后,guava cache并不会主动刷新到新值,它没有定时清理和加载的功能,而是依赖于查询请求。在查询的时候去比对上次更新的时间,如超过指定时间则进行加载或刷新。所以,如果隔了很长一段时间再去查询,得到的这个旧值可能来自于很长时间之前,这将会引发问题。

三、混合策略:refreshAfterWrite + expireAfterWrite

利用refreshAfterWrite进行刷新,利用expireAfterWrite进行兜底,防止过长时间之后返回旧值。因此,expireAfterWrite可以设置的比refreshAfterWrite大一些。

参考:
https://blog.csdn.net/abc86319253/article/details/53020432
https://blog.csdn.net/aitangyong/article/details/53504253
https://www.jianshu.com/p/64b0df87e51b

你可能感兴趣的:(Java)