Guava缓存器源码分析——CacheBuilder

    CacheBuilder作为LoadingCache 与 Cache实例的创建者,具有以下特征:
       1、自动载入键值至缓存;
       2、当缓存器溢出时,采用最近最少使用原则进行替换。
       3、过期规则可基于最后读写时间。
       4、设置键值引用级别。
       5、元素移出通知。
       6、缓存访问统计。
 
    示例:
       LoadingCache cache = CacheBuilder.newBuilder()
                      .maximumSize(10)
                      .expireAfterWrite(10, TimeUnit.SECONDS)
                      .build(
                            new CacheLoader() {
                                   public Integer load(String key) throws Exception {
                                          return loadKey(key);
                                   }
                            });
     例子中设定了缓存大小为10,写后10秒过期,命中失败时会通过load方法将查询键值加入缓存。
   
     缓存的移出策略主要有以下几种:
       1)基于缓存权重            
       LoadingCache loadingCache = CacheBuilder.newBuilder()
                .maximumWeight(10)
                .weigher(new Weigher() {
                    public int weigh(String k, Integer v) {
                        return v;    //v的权重设为其本身;
                    }
                })
                .recordStats()
                .build(
                        new CacheLoader() {
                            public Integer load(String key) {
                                return num++;  //num初始值为1;
                            }
                        });
     System.out.println(loadingCache.get("a"));
            System.out.println(loadingCache.get("b"));
            System.out.println(loadingCache.get("c"));
            System.out.println(loadingCache.get("d"));
            System.out.println(loadingCache.get("a"));
        输出结果为1  2  3  4  1,当设置为maximumWeight(9)时,输出结果即为1  2  3  4  5,因为在get("d")时,权重值和已超过最大值9,a被移出,get("a")时,需重新加载,此时num为5。
    
    2)基于时间

       expireAfterAccess(long, TimeUnit):最后一次访问后的一段时间移出;

         expireAfterWrite(long, TimeUnit)  :最后一次写入后的一段时间移出;

    

    3 ) 基于引用

       键、值默认都是强引用,但键可设置弱引用(weakKeys),值可设置弱(weakValues)或软引用(softValues) 。

  强引用:如果一个对象具有强引用,垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。
  软引用:如果一个对象只具有软引用,如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。
  弱引用:在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。
    
     通过recordStats()函数,还可开启缓存的访问统计,通过调用status()方法,返回包含统计信息的CacheStats对象,可以获取缓存的很多统计信息:hitCount(命中成功次数),missCount(命中失败次数),loadSuccessCount(载入成功次数),loadExceptionCount(载入失败次数),totalLoadTime(总载入时间),evictionCount(移除次数),requestCount() (访问次数),hitRate()(命中成功率),missRate()(命中失败率),loadCount()(载入次数)等。

你可能感兴趣的:(Guava)