Estratégia de Cacheamento
Regras
- Armazene em cache em todas as camadas: navegador (Cache-Control), CDN (ponta), aplicação (Redis), banco de dados (cache de consultas)
- Use
stale-while-revalidate para conteúdo que pode ficar levemente desatualizado — sirva rápido, atualize em segundo plano
- Cabeçalhos Cache-Control:
public, max-age=31536000, immutable para ativos estáticos com hash; public, s-maxage=60, stale-while-revalidate=300 para páginas dinâmicas
- Cache Redis: serialize para JSON, defina TTL em cada chave, use chaves com namespace (
cache:users:123)
- React Query / TanStack Query: defina
staleTime (por quanto tempo os dados são frescos) e gcTime (por quanto tempo manter na memória)
- Invalide na escrita — quando os dados mudarem, exclua ou atualize a entrada do cache imediatamente
- Use o padrão cache-aside: verifique o cache primeiro, busque da fonte no erro, escreva no cache
- Para Next.js: aproveite ISR (
revalidate), unstable_cache e cache de fetch para componentes servidores
- Invalidação baseada em tags: marque entradas em cache por tipo de entidade, invalide todas as entradas de uma tag na mutação
Padrões
async function getCachedUser(id: string) {
const cached = await redis.get(`user:${id}`);
if (cached) return JSON.parse(cached);
const user = await db.user.findUnique({ where: { id } });
await redis.set(`user:${id}`, JSON.stringify(user), "EX", 3600);
return user;
}
Evite
- Cache sem TTL — dados desatualizados persistirão indefinidamente
- Cache de dados específicos de usuário em cache CDN compartilhado — use cabeçalhos
private ou Vary
- Estouro de cache: use bloqueio ou
stale-while-revalidate para evitar a avalancha de requisições
- Cache de respostas de erro — apenas armazene em cache resultados bem-sucedidos