Introdução ao Guava CacheLoader

Introdução ao Guava CacheLoader

1. Introdução

Neste artigo, apresentaremos o GuavaCacheLoader.

Antes de continuar lendo, é recomendado que haja um entendimento básico da classeLoadingCache primeiro. Isso ocorre porqueCacheLoader trabalha com ele especificamente.

Essencialmente, oCacheLoader é uma função usada para calcular um valor no caso de não ser encontrado em um GoiabaLoadingCache.

2. Usando umCacheLoader com umLoadingCache

Quando há uma falha de cache comLoadingCache, ou o cache precisa ser atualizado, oCacheLoader será usado para calcular os valores. Isso ajuda a encapsular nossa lógica de cache em um só lugar, tornando nosso código mais coeso.

2.1. Dependência do Maven

Primeiro, vamos adicionar nossa dependência Maven:


  com.google.guava
  guava
  21.0

Você pode encontrar a versão mais recente emMaven repository.

2.2. Valores de computação e cache

Agora, vamos ver como podemos instanciar umLoadingCache com umCacheLoader:

LoadingCache loadingCache = CacheBuilder.newBuilder()
  .build(new CacheLoader() {
    @Override
    public String load(final String s) throws Exception {
      return slowMethod(s);
    }
});

Essencialmente, oLoadingCache chamará nossoCacheLoader embutido sempre que precisar calcular um valor que não foi armazenado em cache. Vamos tentar contar quantas vezes nossoslowMethod() é chamado quando recuperamos algo do cache várias vezes:

String value = loadingCache.get("key");
value = loadingCache.get("key");

assertThat(callCount).isEqualTo(1);
assertThat(value).isEqualTo("expectedValue");

Como podemos ver, foi chamado apenas uma vez. Na primeira vez em que o valor não foi armazenado em cache, ele ainda precisava ser calculado. Na segunda vez, ele foi armazenado em cache da chamada anterior, para que pudéssemos evitar a sobrecarga de chamar nossoslowMethod() novamente.

2.3. Atualizando o Cache

Outro problema comum com o cache é atualizar o cache. Embora o aspecto mais difícil seja saberwhen para atualizar o cache, outro é saberhow.

Resolverhow é simples ao usarCacheLoader. OLoadingCache simplesmente o invocará para cada valor que precisa ser atualizado. Vamos tentar isso com um teste:

String value = loadingCache.get("key");
loadingCache.refresh("key");

assertThat(callCount).isEqualTo(2);
assertThat(value).isEqualTo("key");

Ao contrário de nossas chamadas subsequentes paraget(), refresh(), forçará oCacheLoader a ser chamado novamente, garantindo que nossos valores estejam atualizados.

3. Conclusão

Neste artigo, explicamos como umLoadingCache é usado por umCacheLoader para calcular valores em perdas de cache e também em atualizações de cache. Também vale a pena conferir este artigo mais aprofundado emGuava Caching.

A implementação desses exemplos pode ser encontradaover on GitHub. Este é um projeto do Maven, portanto deve ser fácil de executar como está.