O cache armazena cópias de dados em uma camada de armazenamento mais rápida para que requisições repetidas sejam atendidas sem acessar a origem — reduzindo a latência, a carga do backend e os custos de infraestrutura.
Resumo O cache é a prática de armazenar uma cópia de dados em uma camada de armazenamento rápida e temporária (o cache) para que requisições futuras possam ser respondidas sem repetir o cálculo original ou a consulta ao banco de dados. Um cache hit retorna dados instantaneamente do cache. Um cache miss busca na origem e armazena o resultado para uso futuro. O cache reduz os tempos de resposta de centenas de milissegundos para menos de 10 milissegundos para requisições repetidas. Cada camada da web moderna usa cache: CPUs, navegadores, servidores de aplicação, bancos de dados, CDNs e redes distribuídas.
O que é cache?
Cache é armazenar uma cópia reutilizável de dados em uma camada de armazenamento mais rápida para que requisições subsequentes pelos mesmos dados possam ser atendidas sem repetir a busca ou o cálculo original.
A mecânica fundamental:
- Cache hit — Os dados solicitados são encontrados no cache. Retornados imediatamente, sem necessidade de requisição à origem.
- Cache miss — Os dados solicitados não estão no cache. O sistema busca na origem, armazena o resultado em cache e o retorna.
- TTL (Time To Live) — A duração pela qual um item em cache é considerado válido antes de precisar ser atualizado.
- Eviction — Quando o cache está cheio, itens antigos ou menos usados são removidos para dar espaço. Políticas comuns: LRU (Least Recently Used), LFU (Least Frequently Used), FIFO (First In First Out).
Tipos de cache
O cache acontece em cada camada do stack tecnológico:
| Camada de cache | Onde opera | O que armazena | Latência típica |
|---|---|---|---|
| Cache de CPU (L1/L2/L3) | Dentro do processador | Instruções e dados da RAM | < 1 nanosegundo |
| Cache do navegador | Dispositivo do usuário | HTML, CSS, JavaScript, imagens | 0 ms (disco local) |
| Cache de aplicação | Memória do servidor de aplicação | Resultados calculados, dados de sessão | < 1 ms |
| Cache de consultas de banco de dados | Camada de banco de dados | Conjuntos de resultados de consultas | < 5 ms |
| Cache CDN / distribuído | Nós de rede distribuídos | Conteúdo web estático e dinâmico | < 10 ms (PoP mais próximo) |
| Cache DNS | Resolver e SO | Mapeamentos domínio-para-IP | < 1 ms (após primeiro lookup) |
Estratégias de cache
| Estratégia | Como funciona | Melhor para | Risco |
|---|---|---|---|
| Cache-aside (carregamento preguiçoso) | App verifica o cache primeiro; em miss, carrega da origem e popula o cache | Cargas de trabalho com muita leitura | Cold start inicial |
| Write-through | Cada escrita vai ao cache e à origem simultaneamente | Dados críticos de consistência | Escritas mais lentas |
| Write-back (write-behind) | Escritas vão primeiro ao cache; a origem é atualizada de forma assíncrona | Alta capacidade de escrita | Perda de dados em falha do cache |
| Read-through | O cache lida com a busca de forma transparente; app só fala com o cache | Simplificar a lógica do app | Dependência de biblioteca de cache |
| Stale-while-revalidate | Serve conteúdo em cache desatualizado imediatamente; atualiza em segundo plano | Desempenho web, CDN | Desatualização breve aceitável |
Headers HTTP de cache
O cache de CDN e navegador é controlado por headers HTTP:
| Header | Significado |
|---|---|
Cache-Control: max-age=3600 | Armazena esta resposta em cache por 3600 segundos (1 hora) |
Cache-Control: no-store | Nunca armazenar esta resposta em nenhum lugar |
Cache-Control: no-cache | Armazenar em cache, mas revalidar com a origem antes de servir |
Cache-Control: public | A resposta pode ser armazenada por caches compartilhados (CDNs, proxies) |
Cache-Control: private | Apenas o navegador do usuário final pode armazená-la em cache |
ETag | Identificador único para uma versão de um recurso; habilita requisições condicionais |
Vary | Diz aos caches para armazenar versões separadas com base nos headers especificados (ex.: Vary: Accept-Encoding) |
Invalidação de cache
A invalidação de cache é o processo de remover ou atualizar dados em cache antes que seu TTL expire. É um dos problemas mais difíceis em sistemas distribuídos.
Métodos:
- Purge — Excluir explicitamente uma URL ou chave específica do cache.
- Invalidação baseada em tags — Agrupar entradas de cache por tag e purgar todas as entradas que compartilham uma tag de uma só vez.
- URLs versionadas — Incorporar um hash de versão em URLs de assets (ex.:
style.abc123.css); nova versão = nova URL = cache miss automático. - Surrogate keys — Usadas por CDNs para invalidar grupos de objetos relacionados com uma única chamada de API.
Erros comuns de cache
| Erro | Consequência | Solução |
|---|---|---|
Armazenar respostas personalizadas em cache sem Vary | Usuário A recebe os dados privados do usuário B | Adicione Vary: Cookie ou evite cachear respostas privadas |
| TTL definido arbitrariamente alto | Conteúdo desatualizado exibido após atualizações | Defina o TTL com base na frequência real de mudanças dos dados |
| Sem plano de invalidação | Erros e conteúdo desatualizado persistem indefinidamente | Implemente endpoints de purge ou URLs versionadas |
| Armazenar respostas de erro (500) em cache | Respostas de erro servidas do cache por horas | Exclua explicitamente códigos de status não-2xx do cache |
| Cache stampede ao expirar | Pico de requisições à origem quando um item popular expira simultaneamente | Use stale-while-revalidate ou request coalescing |
Perguntas frequentes
O que é cache em termos simples? Cache armazena uma cópia dos dados em um local mais rápido para que os mesmos dados possam ser retornados rapidamente na próxima vez sem buscá-los novamente na fonte original.
O que é cache hit vs cache miss? Um cache hit significa que os dados solicitados foram encontrados no cache e retornados imediatamente. Um cache miss significa que os dados não estavam no cache — o sistema precisou buscá-los na fonte original, o que leva mais tempo.
O que é TTL no cache? TTL (Time To Live) é o número de segundos que um item em cache é considerado válido. Um TTL de 3600 significa que o item fica em cache por 1 hora. Quando o TTL expira, a próxima requisição aciona uma nova busca na origem.
Uma CDN é o mesmo que cache? Não. Uma CDN (Content Delivery Network) é uma rede distribuída de servidores. O cache é uma das técnicas que as CDNs usam. O cache também acontece em navegadores, aplicações, bancos de dados e outras camadas completamente separadas das CDNs.
O que é invalidação de cache e por que é difícil? Invalidação de cache significa remover ou atualizar dados em cache antes que seu TTL expire. É difícil porque em sistemas distribuídos, os mesmos dados estão em cache em múltiplos lugares simultaneamente — uma entrada de cache pode precisar ser invalidada em centenas de nós de rede distribuída, múltiplos caches de navegador e caches de nível de aplicação ao mesmo tempo.
Como funciona o cache do navegador? Os navegadores armazenam assets (imagens, CSS, JavaScript) em cache com base nos headers de resposta HTTP. O header Cache-Control: max-age diz ao navegador por quanto tempo manter o arquivo. Quando o TTL expira, o navegador solicita uma versão atualizada ao servidor.
O que é stale-while-revalidate? Stale-while-revalidate é uma diretiva de cache onde o cache serve uma resposta ligeiramente desatualizada imediatamente enquanto simultaneamente busca uma versão atualizada em segundo plano. Isso elimina a latência de revalidação sem servir conteúdo significativamente desatualizado.
Qual é a diferença entre cache-aside e read-through? No cache-aside, o código da aplicação gerencia o cache — verifica o cache e, em caso de miss, carrega os dados da origem e popula o cache. No read-through, a camada de cache lida com a busca da origem de forma transparente, e a aplicação só interage com o cache.