在刷新相同密钥的值时,Google Guava Cache是​​否会执行重复数据删除

时间:2017-11-02 19:26:12

标签: caching guava google-guava-cache

我使用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;
}

1 个答案:

答案 0 :(得分:0)

是的,请参阅LoadingCache.get(K)(及其兄弟,Cache.get(K, Runnable))的文档:

  

如果对get(K)getUnchecked(K)的另一个调用当前正在加载key的值,则只需等待该线程完成并返回其加载的值。

因此,如果当前正在计算(或重新加载/重新计算)缓存条目,则尝试检索该条目的其他线程将等待计算完成 - 它们不会启动自己的冗余刷新。