¿Alguien puede ayudarme a entender Guava CacheLoader?


Soy nuevo en la biblioteca de Guayaba de Google y estoy interesado en el paquete de almacenamiento en caché de Guayaba. Actualmente tengo la versión 10.0.1 descargado. Después de revisar la documentación, el JUnit prueba el código fuente e incluso después de buscar mucho en Google, todavía no puedo averiguar cómo usar el paquete de almacenamiento en caché. La documentación es muy corta, como si estuviera escrita para alguien que ha estado usando la biblioteca de Guayaba, no para un novato como yo. Solo deseo que haya más ejemplos del mundo real sobre cómo usar el almacenamiento en caché empaquete correctamente.

Digamos que quiero construir una caché de 10 elementos que no expiran con el método de desalojo Menos Utilizado Recientemente (LRU). Así que a partir del ejemplo que se encuentra 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; // ?????
         }
       });

Dado que el CacheLoader es necesario, tengo que incluirlo en el método de compilación de CacheBuilder. Pero no se como devolver el valor apropiado de mycache.

Para añadir un elemento a mycache, utilizo el siguiente código:

mycache.asMap().put("key123", "value123");

Para obtener el elemento de mycache, utilizo este método:

mycache.get("key123")

El método get siempre devolverá cualquier valor que haya devuelto del método load de CacheLoader en lugar de obtener el valor de mycache. ¿Podría alguien decirme qué me perdí?

Author: ColinD, 2011-10-16

1 answers

El tipo Cache de Guayaba está generalmente destinado a ser utilizado como un caché de computación. Por lo general, no se agregan valores manualmente. Más bien, le dices cómo cargar el caro para calcular el valor de 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 diste y mycache.get("key123") devolví "value123" como se esperaba.

 35
Author: ColinD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-11 20:42:34