Dos cosas que realmente me gustan de CacheLoader de Guava 11 (¡gracias, Google!) Son loadAll(), que me permite cargar varias claves a la vez, y volver a cargar(), me permite volver a cargar una clave de forma asíncrona cuando está "obsoleta" pero existe un valor anterior. Tengo curiosidad sobre cómo juegan juntos, ya que reload() funciona con una sola clave.Google Guava's CacheLoader loadAll() vs reload() semántica
Concretamente, se extiende el ejemplo de 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);
}
});
}
}
});
... donde "getAllGraphsFromDatabase()" hace una consulta de base de datos agregada en lugar de longitud (teclas) consultas individuales.
¿Cómo se combinan estos dos componentes de un dispositivo LoadingCache? Si algunas claves en mi solicitud para getAll() no están presentes en la memoria caché, se cargan como un grupo con loadAll(), pero si algunas necesitan actualizarse, ¿se vuelven a cargar individualmente con load()? Si es así, ¿hay planes para admitir un reloadAll()?
[Cache.getAll no puede desencadenar actualización # 971] (https://github.com/google/guava/issues/971) todavía está abierto para votar – Vadzim