Google Guava Cache在刷新同一个key的值时是否做去重
Does Google Guava Cache do deduplication when refreshing value of the same key
我使用 Google Guava 实现了一个非阻塞缓存,缓存中只有一个键,键的值仅异步刷新(通过覆盖 reload())。
我的问题是,如果第一个 reload() 任务还没有完成,并且有一个新的 get() 请求进来,Guava 缓存是否会处理重复数据删除。
//Cache is defined like below
this.cache = CacheBuilder
.newBuilder()
.maximumSize(1)
.refreshAfterWrite(10, TimeUnit.MINUTES)
.recordStats()
.build(loader);
//reload is overwritten asynchronously
@Override
public ListenableFuture<Map<String, CertificateInfo>> reload(final String key, Map<String, CertificateInfo> prevMap) throws IOException {
LOGGER.info("Refreshing certificate cache.");
ListenableFutureTask<Map<String, CertificateInfo>> task = ListenableFutureTask.create(new Callable<Map<String, CertificateInfo>>() {
@Override
public Map<String, CertificateInfo> call() throws Exception {
return actuallyLoad();
}
});
executor.execute(task);
return task;
}
是,请参阅 LoadingCache.get(K)
(and it sibling, Cache.get(K, Runnable)
的文档):
If another call to get(K)
or getUnchecked(K)
is currently loading the value for key, simply waits for that thread to finish and returns its loaded value.
因此,如果当前正在计算缓存条目(或 reloaded/recomputed),则尝试检索该条目的其他线程将简单地等待计算完成 - 它们不会启动自己的冗余刷新。
我使用 Google Guava 实现了一个非阻塞缓存,缓存中只有一个键,键的值仅异步刷新(通过覆盖 reload())。
我的问题是,如果第一个 reload() 任务还没有完成,并且有一个新的 get() 请求进来,Guava 缓存是否会处理重复数据删除。
//Cache is defined like below
this.cache = CacheBuilder
.newBuilder()
.maximumSize(1)
.refreshAfterWrite(10, TimeUnit.MINUTES)
.recordStats()
.build(loader);
//reload is overwritten asynchronously
@Override
public ListenableFuture<Map<String, CertificateInfo>> reload(final String key, Map<String, CertificateInfo> prevMap) throws IOException {
LOGGER.info("Refreshing certificate cache.");
ListenableFutureTask<Map<String, CertificateInfo>> task = ListenableFutureTask.create(new Callable<Map<String, CertificateInfo>>() {
@Override
public Map<String, CertificateInfo> call() throws Exception {
return actuallyLoad();
}
});
executor.execute(task);
return task;
}
是,请参阅 LoadingCache.get(K)
(and it sibling, Cache.get(K, Runnable)
的文档):
If another call to
get(K)
orgetUnchecked(K)
is currently loading the value for key, simply waits for that thread to finish and returns its loaded value.
因此,如果当前正在计算缓存条目(或 reloaded/recomputed),则尝试检索该条目的其他线程将简单地等待计算完成 - 它们不会启动自己的冗余刷新。