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()」は、length(keys)の個々のクエリではなく、集約データベースクエリを実行します。
LoadingCacheのこれら2つのコンポーネントはどのように連携しますか?getAll()へのリクエストの一部のキーがキャッシュに存在しない場合、それらはloadAll()を使用してグループとしてロードされますが、更新が必要な場合、それらはload()を使用して個別に再ロードされますか?もしそうなら、reloadAll()をサポートする計画はありますか?