Cache em Java: Redis, Memcached e soluções embutidas para profissionais

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Cache em Java: Redis, Memcached e soluções embutidas: nível avançado



Cache é uma das ferramentas-chave para melhorar o desempenho e a escalabilidade de aplicações Java. No nível avançado, o desenvolvedor enfrenta a escolha entre sistemas distribuídos (Redis, Memcached) e caches embutidos leves (Caffeine, Guava). Neste artigo, analisaremos as diferenças arquitetônicas, cenários de uso e forneceremos exemplos práticos de código para cada solução.



1. Caches embutidos: Caffeine e Guava



Caches embutidos operam dentro da JVM e não requerem serviços externos. Eles são ideais para armazenar dados temporários que não precisam ser sincronizados entre nós.



Caffeine — o padrão moderno

Caffeine é uma biblioteca de alto desempenho para cache em Java que substituiu o Guava Cache. Ela usa o algoritmo Window TinyLFU para remoção eficiente de entradas.



// Dependência Maven// <dependency>//     <groupId>com.github.ben-manes.caffeine</groupId>//     <artifactId>caffeine</artifactId>//     <version>3.1.8</version>// </dependency>

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, User> userCache = Caffeine.newBuilder() .expireAfterWrite(10, TimeUnit.MINUTES) .maximumSize(10_000) .recordStats() .build();

// Escrita userCache.put("user:123", new User("Alice", "alice@example.com"));

// Leitura User user = userCache.getIfPresent("user:123"); System.out.println("Usuário em cache: " + user);

// Leitura atômica com carregamento User result = userCache.get("user:456", key -> loadUserFromDB(key)); }

private static User loadUserFromDB(String key) { // Simulação de carregamento do banco de dados return new User("Bob", "bob@example.com"); }

static class User { private final String name; private final String email;

User(String name, String email) { this.name = name; this.email = email; }

@Override public String toString() { return "User{name='" + name + "', email='" + email + "'}"; } }}


Guava Cache — solução comprovada

O Guava Cache do Google continua sendo uma escolha popular para projetos que já usam a biblioteca Guava. Ele suporta várias estratégias de remoção e listeners.



import com.google.common.cache.CacheBuilder;import com.google.common.cache.CacheLoader;import com.google.common.cache.LoadingCache;

import java.util.concurrent.ExecutionException;import java.util.concurrent.TimeUnit;

public class GuavaCacheExample { public static void main(String[] args) throws ExecutionException { LoadingCache<String, String> cache = CacheBuilder.newBuilder() .expireAfterAccess(5, TimeUnit.MINUTES) .maximumSize(5000) .removalListener(notification -> System.out.println("Removido: " + notification.getKey())) .build(new CacheLoader<String, String>() { @Override public String load(String key) { return "Calculado: " + key.toUpperCase(); } });

// Escrita cache.put("key1", "value1");

// Leitura com carregamento automático String value = cache.get("key2"); System.out.println(value); // "Calculado: KEY2" }}


2. Cache distribuído com Redis



Redis é um

Blogs

Book Recommendations