关于 Guava 11 的 CacheLoader(感谢 Google!),我真正喜欢的两件事是 loadAll(),它允许我一次加载多个密钥,以及 reload(),它允许我在密钥“陈旧”时异步重新加载密钥,但是旧值存在。我很好奇它们是如何一起玩的,因为 reload() 只在一个键上运行。
具体来说,从CachesExplained扩展示例:
LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
.maximumSize(1000)
.refreshAfterWrite(1, TimeUnit.MINUTES)
.build(
new CacheLoader<Key, Graph>() {
public Graph load(Key key) { // no checked exception
return getGraphFromDatabase(key);
}
public Map<Key, Graph> loadAll(Iterable<? extends K> keys) {
return getAllGraphsFromDatabase(keys);
}
public ListenableFuture<Graph> reload(final Key key, Graph prevGraph) {
if (neverNeedsRefresh(key)) {
return Futures.immediateFuture(prevGraph);
} else {
// asynchronous!
return ListenableFutureTask.create(new Callable<Graph>() {
public Graph call() {
return getGraphFromDatabase(key);
}
});
}
}
});
...其中“getAllGraphsFromDatabase()”执行聚合数据库查询,而不是长度(键)单个查询。
LoadingCache 的这两个组件如何协同工作?如果我对 getAll() 的请求中的某些键不存在于缓存中,它们将作为一个组与 loadAll() 一起加载,但如果有些需要刷新,它们是否会通过 load() 单独重新加载?如果是这样,是否有计划支持 reloadAll()?