`
marb
  • 浏览: 409543 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

google guava cache 处理

 
阅读更多

使用本地内存

 

Java代码  收藏代码
  1. LoadingCache<Long, User> cache = CacheBuilder.newBuilder().maximumSize(100)  
  2.                 .expireAfterAccess(5, TimeUnit.SECONDS).build(new CacheLoader<Long, User>() {  
  3.                     @Override  
  4.                     public User load(Long key) throws Exception {  
  5.                         logger.info("fetch from database");  
  6.                         return accountManager.getUser(key);  
  7.                     }  
  8.   
  9.                 });  

 

//设置缓存最大个数为100,缓存过期时间为5秒

 

回收的参数设置

 

1. 大小的设置:CacheBuilder.maximumSize(long) CacheBuilder.weigher(Weigher) CacheBuilder.maxumumWeigher(long)

2. 时间:expireAfterAccess(long, TimeUnit) expireAfterWrite(long, TimeUnit)

3. 引用:CacheBuilder.weakKeys() CacheBuilder.weakValues() CacheBuilder.softValues()

4. 明确的删除:invalidate(key) invalidateAll(keys) invalidateAll()

5. 删除监听器:CacheBuilder.removalListener(RemovalListener)

 

refresh机制

 

1. LoadingCache.refresh(K) 在生成新的value的时候,旧的value依然会被使用。

2. CacheLoader.reload(K, V) 生成新的value过程中允许使用旧的value

3. CacheBuilder.refreshAfterWrite(long, TimeUnit) 自动刷新cache

 

 

类似ConcurrentMap, 数据存在内存而不是file,外部server, 否则可以用memcached(待会儿解释)

如果value是通过正常的func使用key来得到的,那么可以使用CacheLoader,如果需要override,那么使用Callable

正常的使用方法是, LoadingCache.get(K), 将会查询cache,如果cache没有,那么会CacheLoader会将value加入cache,

注意的是,CacheLoader可能会抛出异常,所以如果你的LoadingCache中没有处理异常的话,那么最好使用 getUnchecked(K)方法

getAll(Iterable<? extends K>) 方法可以 批读取, 也是分成一个个key来处理,但是肯定比手工的效率更高, 可以通过override CacheLoader.loadAll 来更好的处理

 

get(K, Callable<V>), 这个方法实现了if cached, return; otherwise create, cache and return 模式

即如果cache了返回,如果没有通过callable接口的方法来create,然后cache,最后返回

 

Java代码  收藏代码
  1. Cache<Key, Value> cache = CacheBuilder.newBuilder()  
  2.     .maximumSize(1000)  
  3.     .build(); // look Ma, no CacheLoader  
  4. ...  
  5. try {  
  6.   // If the key wasn't in the "easy to compute" group, we need to  
  7.   // do things the hard way.  
  8.   cache.get(key, new Callable<Value>() {  
  9.     @Override  
  10.     public Value call() throws AnyException {  
  11.       return doThingsTheHardWay(key);  
  12.     }  
  13.   });  
  14. catch (ExecutionException e) {  
  15.   throw new OtherException(e.getCause());  
  16. }  

 

直接操作cache

使用cache.put(key,value), 同时可以使用Cache.asMap()来调用所以ConcurrentMap的方法来操作cache,但是通过asMap的数据不会自动loading到cache

 

三种清出cache的模式size-based eviction, time-based eviction, and reference-based eviction.

size-based:

 

Java代码  收藏代码
  1. LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()  
  2.        .maximumWeight(100000)  
  3.        .weigher(new Weigher<Key, Graph>() {  
  4.           public int weigh(Key k, Graph g) {  
  5.             return g.vertices().size();  
  6.           }  
  7.         })  
  8.        .build(  
  9.            new CacheLoader<Key, Graph>() {  
  10.              public Graph load(Key key) { // no checked exception  
  11.                return createExpensiveGraph(key);  
  12.              }  
  13.            });  

 

weigher,作用是将g.vertices().size()作为一个单位大小,重载此方法, 同时是在cache创建的时候计算

 

time-based:

expireAfterAccess(long, TimeUnit)  基于访问(read or write)

expireAfterWrite(long, TimeUnit)基于创建(after create)

 

reference-based

CacheBuilder.weakKeys(), 使用weak references来建立key,这样的话如果key没有引用了(strong or soft),key就会被垃圾回收,同时垃圾回收使用==来判断key值

CacheBuilder.weakValues(),  同上,作用到value上

CacheBuilder.softValues() , 对value进行排序,

 

主动清出cache

Cache.invalidate(key)

 Cache.invalidateAll(keys)

  Cache.invalidateAll()

 

 

clearUp,  cache不会自己clearup,一般需要通过线程定制,定时的clearup

 

refresh 操作, 与evict不同, 是给key一个new value, 同时如果在refresh时有访问,那么将会返回old value, 而evict则会等待evict结束返回new value

定义refresh一般使用异步的操作

如:

 

Java代码  收藏代码
  1. // Some keys don't need refreshing, and we want refreshes to be done asynchronously.  
  2. LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()  
  3.        .maximumSize(1000)  
  4.        .refreshAfterWrite(1, TimeUnit.MINUTES)  
  5.        .build(  
  6.            new CacheLoader<Key, Graph>() {  
  7.              public Graph load(Key key) { // no checked exception  
  8.                return getGraphFromDatabase(key);  
  9.              }  
  10.   
  11.              public ListenableFuture<Graph> reload(final Key key, Graph prevGraph) {  
  12.                if (neverNeedsRefresh(key)) {  
  13.                  return Futures.immediateFuture(prevGraph);  
  14.                } else {  
  15.                  // asynchronous!  
  16.                  return ListenableFutureTask.create(new Callable<Graph>() {  
  17.                    public Graph call() {  
  18.                      return getGraphFromDatabase(key);  
  19.                    }  
  20.                  });  
  21.                }  
  22.              }  
  23.            });  

 

 

 在refreshAfterWrite方法,会调用reload

 

数据

  提供了一些数据采集的方法

   CacheBuilder.recordStats() 方法启动了 cache的数据收集

    Cache.stats() 返回了一个CacheStats对象, 提供一些数据方法

    hitRate(), 请求点击率

    averageLoadPenalty(), 加载new value,花费的时间, 单位nanosecondes

    evictionCount(), 清除的个数

分享到:
评论
1 楼 yukaizhao 2014-08-13  
推荐一个很全的guava教程 http://outofmemory.cn/java/guava/

相关推荐

    不加密Google Guava视频教程.txt

    ├─Google Guava 第01讲-Joiner详细介绍以及和Java8Collector对比.wmv ├─Google Guava 第02讲-Guava Splitter详细讲解以及实战练习...├─Google Guava 第34讲-Guava Cache之RecordStats,CacheBuilderSpec详解.wmv

    google guava

    google guava框架,包括Getting Started with Google Guava、google cache、base、io等介绍

    Guava-CacheDemo.rar

    Google Guava-Cache 详细注释。。。。。。。。。。。。。。。。。。。。。。(凑足50字)

    Guava-Cache-Demo:演示如何使用 Guava 缓存

    Guava-Cache-Demo 演示如何使用 Guava 缓存。 此示例应用程序使用 Google Books API 获取给定 ISBN 的图书的详细信息。

    cache-demo:各种缓存工具

    简介guava cache 是 Google 提供的一套本地内存缓存的 java 实现,具备了缓存的加载、更新、并发保护、自动回收、状态监控等功能,够用且还算轻量。###2. demo// 数据加载器,key 对应数据未被缓存时,通过此加载器...

    Android代码-guava

    Guava: Google Core Libraries for Java Guava is a set of core libraries that includes new collection types (such as multimap and multiset), immutable collections, a graph library, functional types, ...

    guava-18.0.jar

    解决rocketmq-filter中com.google.common.cache*等缺包问题,包含所有com.google.common类,内含使用说明,解决问题一步到位

    Guava 16.0 API (CHM格式)

    Ranges: Guava 一个强大的 API,提供 Comparable 类型的范围处理, 包括连续和离散的情况。  九. I/O: 简化 I/O 操作, 特别是对 I/O 流和文件的操作, for Java 5 and 6.  十. Hashing: 提供比 Object.hashCode...

    Java类库大全.docx

    Guava:由Google提供的Java类库,提供了许多用于优化和提高开发效率的工具和组件,如Guava Cache(提供了缓存功能)、Guava EventBus(提供了事件总线功能)、Guava Cache(提供了缓存功能)等。 Spring Framework:...

    guava16.0 chm文档

     com.google.common.cache:缓存工具包,非常简单易用且功能强大的JVM内缓存。  com.google.common.collect:带泛型的集合接口扩展和实现,以及工具类,这里你会发现很多好玩的集合。  ...

    Java8的高性能缓存库caffeine.zip

    Caffeine使用Google Guava启发的API提供内存缓存。 改进取决于您设计Guava缓存和ConcurrentLinkedHashMap的体验。LoadingCache, Graph&gt; graphs = Caffeine.newBuilder()  .maximumSize(10_000)  ....

    图书库:图书库管理平台

    Guava-谷歌提供的一组核心Java库,特别使用了Guava Cache JUnit 5-测试框架 怎么跑 生成应用程序,部署它并运行测试。 mvn deploy 运行应用程序 java -jar target/book-library-0.0.1-SNAPSHOT.jar API端点 图书...

    cache-comparison:缓存打击

    缺点: 未实现Map接口性能问题:所有方法(读/写)都已同步过于简化的API:仅获取/放入难以测试对Java 8不友好##番石榴缓存来自Google的应用缓存( ) 优点: 战斗测试功能齐全(自加载缓存,刷新策略,统计信息......

    高级java笔试题-itresource:程序开发技术资源集合

    Google Java 编程风格指南 ] () [ Quartz应用与集群原理分析 ] () [ heavyz的Tomcat学习笔记(包括启动流程分析、启动脚本分析) ] () [ java8 新特性讲解系列文章 ] () [ Java 从Jar文件中动态加载类 ] () [ Java并发...

    caffeine:Java 8的高性能缓存库

    咖啡因使用受Google Guava启发的API提供内存中缓存。 这些改进基于我们设计和经验。 LoadingCache&lt; Key&gt; graphs = Caffeine . newBuilder() .maximumSize( 10_000 ) .expireAfterWrite( 5 , TimeUnit . MINUTES )...

    java开源包1

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包11

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包2

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包3

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包6

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

Global site tag (gtag.js) - Google Analytics