O que é Caffeine?
Caffeine é uma biblioteca de cache de alto desempenho para Java, projetada com os requisitos modernos de velocidade e eficiência. Ela fornece um cache in-memory com suporte a operações assíncronas, evacuação automática de entradas por tempo ou tamanho, e políticas de despejo configuráveis (por exemplo, baseadas na frequência de uso). A biblioteca é totalmente compatível com Java 8 e superior, e é ativamente usada em grandes projetos, como o Spring Framework (através do Spring Cache).
Para que serve?
O cache permite reduzir o tempo de acesso aos dados, diminuir a carga em bancos de dados ou APIs externas, e aumentar a capacidade de resposta da aplicação. O Caffeine resolve essas tarefas com sobrecarga mínima: ele garante latências de submicrossegundos para leitura e escrita, gerencia automaticamente a memória e permite configurar o cache de forma flexível para requisitos de negócio específicos. Sem ele, você teria que implementar o cache manualmente usando HashMap e timers, o que é complexo e pouco confiável.
Instalação
Adicione a dependência ao seu arquivo pom.xml (Maven):
<dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>3.1.8</version></dependency>Para Gradle:
implementation 'com.github.ben-manes.caffeine:caffeine:3.1.8'Funcionalidades principais
- Evacuação automática: remoção de entradas por tempo de vida (expireAfterWrite, expireAfterAccess) ou por tamanho (maximumSize, maximumWeight).
- Carregamento assíncrono: através de AsyncCache ou métodos loadingCache com suporte a CompletableFuture.
- Estatísticas: coleta de métricas (hit rate, miss rate, evictions) para monitoramento.
- Políticas de despejo: por padrão, é usado o Window TinyLFU (um algoritmo adaptativo, próximo do ideal).
- Segurança contra null: tratamento correto de valores null.
Exemplo de código em Java
import com.github.benmanes.caffeine.cache.Cache;import com.github.benmanes.caffeine.cache.Caffeine;
import java.util.concurrent.TimeUnit;
public class CaffeineExample { public static void main(String[] args) { Cache<String, String> cache = Caffeine.newBuilder() .expireAfterWrite(10, TimeUnit.MINUTES) .maximumSize(100) .recordStats() .build();
// Escrita no cache cache.put("user:123", "Alice");
// Leitura com carregamento automático String user = cache.get("user:456", key -> fetchFromDatabase(key)); System.out.println(user); // null ou resultado do fetch
// Estatísticas System.out.println(cache.stats().hitRate()); }
private static String fetchFromDatabase(String key) { return "Bob"; // Simulação de consulta ao BD }}Quando usar
Caffeine é ideal para armazenar em cache resultados de chamadas de API, dados de banco de dados, cálculos ou qualquer operação que seja executada com frequência e tenha alto custo. Use-o em aplicações web, microsserviços, processos ETL ou em qualquer projeto Java que exija um cache rápido e confiável. Evite o Caffeine se você precisar de cache distribuído (nesse caso, considere Redis ou Hazelcast).
Também na biblioteca
Trabalhando com datas em Swift: Foundation e DateFormatter
Entity Framework Core para C# (.NET): guia completo com exemplos
Event Bus e padrão Observer em Kotlin: implementação e exemplos