guava LoadingCache 使用注意点

原创
2021/10/21 17:39
阅读数 329

注意点:

  • 判断触发缓存更新的时机是在访问缓存时. 如果缓存长时间不访问, 则不会自动更新.
  • refreshAfterWrite vs. expireAfterWrite, 前者refreshAfterWrite是在x时间以后进行refresh, 缓存依然有效; expireAfterWrite是在x时间以后, 缓存直接失效. 两者区别: 在没有重写reload()情况下, 缓存失效以后, 前者会有一个请求线程去刷新缓存, 其他请求使用旧缓存; 后者也会有一个请求线程去刷新缓存, 其他所有线程阻塞等待缓存刷新结果. 两个方法合理组合使用, refreshAfterWrite控制刷新频率, expireAfterWrite控制缓存最长有效时间.
  • 重写reload方法, 将reload异步化. 在 refreshAfterWrite 触发刷新缓存请求以后, 请求线程不再亲自刷新缓存, 而是交给刷新线程去刷新, 请求线程直接返回当前缓存中数据.
    private final LoadingCache<String, String> cache = CacheBuilder.newBuilder()
            .refreshAfterWrite(30, TimeUnit.SECONDS) //控制缓存有效期
            .expireAfterWrite(2, TimeUnit.HOURS) //防止长时间不访问, 导致缓存不准
            .build(new CacheLoader<String, String>() {
                @Override
                public String load(String key) throws Exception {
                    return "";
                }

                @Override
                public ListenableFuture<String> reload(String key, String oldValue) throws Exception {
                		if(noNeedReload()){
                    	return Futures.immediateFuture(oldValue);
                    }
                    ListenableFutureTask task = ListenableFutureTask.create(() -> load(key));
                    ThreadUtil.subsidyInvertDbRefreshExecutor.submit(task);
                    return task;
                }
            });
展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部