Guava用法(二)

原创
2016/12/29 22:24
阅读数 1.4K

Guava用法(二)

    Guava的一个比较常见用法就是一个缓冲的用法,下面就是专门介绍这个缓存的具体用法。第一LoadingCache和CacheLoader的区别,前者是专门用来缓存的,后者是定义加载方式,而后者一般会有三种重载方法。

CacheLoader

CacheLoader<Object, Object> baseLoader = new CacheLoader<Object, Object>() {
      @Override
      public Object load(Object key) {
        loadCount.incrementAndGet();
        return new Object();
      }

      @Override
      public ListenableFuture<Object> reload(Object key, Object oldValue) {
        reloadCount.incrementAndGet();
        return Futures.immediateFuture(new Object());
      }

      @Override
      public Map<Object, Object> loadAll(Iterable<? extends Object> keys) {
        loadAllCount.incrementAndGet();
        return ImmutableMap.of();
      }
    };·

      在使用LoadingCache的builder里面可以放入,这个时候可以注意一下的是CacheLoader的第二个,这里的用法很奇特。 

private static class QueuingExecutor implements Executor {
    private LinkedList<Runnable> tasks = Lists.newLinkedList();

    @Override
    public void execute(Runnable task) {
      tasks.add(task);
    }

    private void runNext() {
      tasks.removeFirst().run();
    }
  }

 QueuingExecutor executor = new QueuingExecutor();
    CacheLoader<Object, Object> asyncReloader =
        CacheLoader.asyncReloading(baseLoader, executor);

    结合LoadingCache,这个是后没执行一次reload都会当做一个task,扔到QueuingExecutor的LinkedList里面,需要取得时候必须要使用:

 executor.runNext();

才可以执行掉task的这个任务。 

    LoadingCache,刚刚讲解了和CacheLoader之间的关系,现在开始具体讲解使用方式。

    LoadingCache<Object, Object> cache = CacheBuilder.newBuilder()
        .recordStats()
        .build(cacheLoader);

    常见的声明就是这种方式,我们可以缓存的具体状态:

CacheStats stats = cache.stats();
stats.missCount();//没有命中的数量
stats.loadSuccessCount();//加载成功数
stats.loadExceptionCount();//加载异常
stats.hitCount();//命中数

    获取key有两种方式get()/getUnchecked(), 其中一个的使用需要,不定义异常情况可以,但CacheLoader声明了检查型异常,就不可以调用getUnchecked(K)。

 cache.get(key);
 cache.getUnchecked(key);

    

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部