Guava Cache 的清空,刷新及统计功能

原创
2017/05/23 16:49
阅读数 1.8W

缓存数据的清空

      guava没有提供自动触发清空缓存数据的功能,而是提供了一种手工调用的方式,使用者需要通过Cache.cleanUp()的方式来清空缓存或者使用invalidate 和 invalidateAll方法从缓存中移除指定缓存项。

      所以一般可以有两种选择,一种是通过某个请求来触发清空动作,这种相当于按需清空,另一种则是通过定时任务,亦成为调度程序来清空,这种相当于与按时清空

缓存数据的刷新

      guava没有提供类似refreshall的方法刷新缓存中的所有值,而只是提供了 LoadingCache.refresh(K)方法,用于刷新某个键值对,这里有趣的是刷新动作是异步的,也就是在值被彻底刷新之前,如果有人取这个key的值,返回的还是没有刷新的值。

      如果你希望定义自己的刷新行为,可以重写 CacheLoader.reload(K, V)方法

LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()  
       .maximumSize(1000)  
       .refreshAfterWrite(1, TimeUnit.MINUTES)  
       .build(  
           new CacheLoader<Key, Graph>() {  
             public Graph load(Key key) { // no checked exception  
               return getGraphFromDatabase(key);  
             }  
  
             public ListenableFuture<Graph> reload(final Key key, Graph prevGraph) {  
               if (neverNeedsRefresh(key)) {  
                 return Futures.immediateFuture(prevGraph);  
               } else {  
                 // asynchronous!  
                 return ListenableFutureTask.create(new Callable<Graph>() {  
                   public Graph call() {  
                     return getGraphFromDatabase(key);  
                   }  
                 });  
               }  
             }  
           });  

缓存数据统计

      可以通过 CacheBuilder.recordStats()方法打开统计, Cache.stats()方法会返回一个CacheStats对象,里面有缓存条目访问率等数据,如果你的缓存需要做一些调优,可以参考这里的数据。

 

展开阅读全文
加载中

作者的其它热门文章

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