caching - expireafterwrite - ¿Alguien puede ayudarme a entender Guava CacheLoader?
guava expireafterwrite (1)
Soy nuevo en la biblioteca de Guava de Google y estoy interesado en el paquete de caché de Guava. Actualmente tengo la versión 10.0.1 descargada. Después de revisar la documentación, el JUnit prueba el código fuente e incluso después de buscar extensamente en google, todavía no puedo entender cómo usar el paquete de caché. La documentación es muy corta, como si hubiera sido escrita para alguien que ha estado usando la biblioteca de Guava, no para un novato como yo. Solo desearía que hubiera más ejemplos del mundo real sobre cómo usar el paquete de caché adecuadamente.
Supongamos que quiero crear un caché de 10 elementos que no caducan con el método de desahucio Menos recientemente utilizado (LRU). Entonces, del ejemplo encontrado en la API, construyo mi código como el siguiente:
Cache<String, String> mycache = CacheBuilder.newBuilder()
.maximumSize(10)
.build(
new CacheLoader<String, String>() {
public String load(String key) throws Exception {
return something; // ?????
}
});
Como CacheLoader es obligatorio, tengo que incluirlo en el método de compilación de CacheBuilder. Pero no sé cómo devolver el valor correcto de mycache.
Para agregar un elemento a mycache, uso el siguiente código:
mycache.asMap().put("key123", "value123");
Para obtener un artículo de mycache, uso este método:
mycache.get("key123")
El método get siempre devolverá cualquier valor que devuelva el método de carga de CacheLoader en lugar de obtener el valor de mycache. ¿Alguien podría decirme amablemente lo que me perdí?
El tipo de Cache
de Guava generalmente está destinado a ser utilizado como un caché de computación . Generalmente no agrega valores manualmente. Más bien, le dice cómo cargar el valor caro para calcular una clave dándole un CacheLoader
que contiene el código necesario.
Un ejemplo típico es cargar un valor de una base de datos o hacer un cálculo costoso.
private final FooDatabase fooDatabase = ...;
private final LoadingCache<Long, Foo> cache = CacheBuilder.newBuilder()
.maximumSize(10)
.build(new CacheLoader<Long, Foo>() {
public Foo load(Long id) {
return fooDatabase.getFoo(id);
}
});
public Foo getFoo(long id) {
// never need to manually put a Foo in... will be loaded from DB if needed
return cache.getUnchecked(id);
}
Además, probé el ejemplo que me diste y mycache.get("key123")
devolvió "value123"
como se esperaba.