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á.