Две вещи, которые мне очень нравятся в CacheLoader в Guava 11 (спасибо, Google!) — это loadAll(), которая позволяет мне загружать несколько ключей одновременно, и reload( ), что позволяет мне асинхронно перезагружать ключ, когда он «устарел», но существует старое значение. Мне любопытно, как они работают вместе, поскольку reload() работает только с одной клавишей.
Конкретно, расширение примера из CachesExplained:
LoadingCache graphs = CacheBuilder.newBuilder()
.maximumSize(1000)
.refreshAfterWrite(1, TimeUnit.MINUTES)
.build(
new CacheLoader() {
public Graph load(Key key) { // no checked exception
return getGraphFromDatabase(key);
}
public Map loadAll(Iterable extends K> keys) {
return getAllGraphsFromDatabase(keys);
}
public ListenableFuture reload(final Key key, Graph prevGraph) {
if (neverNeedsRefresh(key)) {
return Futures.immediateFuture(prevGraph);
} else {
// asynchronous!
return ListenableFutureTask.create(new Callable() {
public Graph call() {
return getGraphFromDatabase(key);
}
});
}
}
});
...где "getAllGraphsFromDatabase()" выполняет агрегированный запрос к базе данных, а не длину (ключи) отдельных запросов.
Как эти два компонента LoadingCache работают вместе? Если некоторые ключи в моем запросе к getAll() отсутствуют в кеше, они загружаются как группа с помощью loadAll(), но если некоторые из них нуждаются в обновлении, загружаются ли они по отдельности с помощью load()? Если да, то есть ли планы по поддержке reloadAll()?