Guava缓存器源码分析——CacheBuilder

    CacheBuilder作为LoadingCache 与 Cache实例的创建者,具有以下特征:
       1、自动载入键值至缓存;
       2、当缓存器溢出时,采用最近最少使用原则进行替换。
       3、过期规则可基于最后读写时间。
       4、设置键值引用级别。
       5、元素移出通知。
       6、缓存访问统计。
 
    示例:
       LoadingCache<String, Integer> cache = CacheBuilder.newBuilder()
                      .maximumSize(10)
                      .expireAfterWrite(10, TimeUnit.SECONDS)
                      .build(
                            new CacheLoader<String, Integer>() {
                                   public Integer load(String key) throws Exception {
                                          return loadKey(key);
                                   }
                            });
     例子中设定了缓存大小为10,写后10秒过期,命中失败时会通过load方法将查询键值加入缓存。
   
     缓存的移出策略主要有以下几种:
       1)基于缓存权重            
       LoadingCache<String, Integer> loadingCache = CacheBuilder.newBuilder()
                .maximumWeight(10)
                .weigher(new Weigher<String, Integer>() {
                    public int weigh(String k, Integer v) {
                        return v;    //v的权重设为其本身;
                    }
                })
                .recordStats()
                .build(
                        new CacheLoader<String, Integer>() {
                            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()(载入次数)等。
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值