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);