Conceiot de Cache
Cache é uma camada de armazenamento temporário de alta velocidade que armazena dados frequentemente acessados, reduzindo a necessidade de buscá-los repetidamente na fonte original. Em sistemas computacionais modernos, o cache é implementado tipicamente com tecnologias como SRAM, que oferece acesso mais rápido em comparação à memória principal baseada em DRAM.
Cache no Contexto Web
O cache web funciona como uma camada intermediária entre o servidor e o cliente, armazenando cópias de recursos como páginas HTML, imagens, scripts JavaScript e dados JSON. Quando uma requisição chega, o mecanismo de cache avalia se possui uma cópia válida do recurso solicitado. Em caso afirmativo, a resposta é entregue diretamente ao cliente sem necessidade de consultar o servidor de origem.
Classificação do Cache Web
- Cache no lado do cliente: Cache do navegador
- Cache no lado do servidor: Nginx, Redis, Memcached, Varnish, entre outros
Cache de Navegador
O cache do navegador armazena localmente recursos previamente carregados, permitindo que acessos subsequentes à mesma URL sejam atendidos sem novas requisições à rede. Isso resulta em carregamento mais rápido das páginas e menor consumo de recursos do servidor.
Benefícios do Cache de Navegador
- Implementação de baixo custo
- Redução do consumo de largura de banda
- Diminuição da carga no servidor
- Menor latência e carregamento mais rápido das páginas
Fluxo de Execução do Cache de Navegador
Os principais cabeçalhos HTTP relacionados ao cache são:
| Cabeçalho | Descrição |
|---|---|
| Expires | Data e hora de expiração do cache |
| Cache-Control | Diretivas de configuração do comportamento do cache |
| Last-Modified | Data da última modificação do recurso |
| ETag | Identificador único da versão do recurso (ex: hash MD5) |
O fluxo completo funciona da seguinte forma:
- Na primeira requisição, o navegador não possui cache local, então envia a solicitação ao servidor.
- O servidor processa a requisição e retorna o status 200 junto com os cabeçalhos de cache apropriados.
- Nas requisições subsequentes, o navegador verifica se possui uma cópia em cache do recurso solicitado.
- Se não houver cache local, o processo volta ao passo 2.
- Se existir cache, o navegador verifica a validade baseando-se no cabeçalho
Expires. - Caso o cache não tenha expirado, o recurso é servido diretamente do armazenamento local.
- Se o cache expirou, o navegador verifica se o recurso foi modificado no servidor.
- Essa verificação é feita através dos cabeçalhos
ETageLast-Modified. - Se o recurso não foi alterado, o servidor retorna o status 304 Not Modified e o navegador utiliza o cache local.
- Se houve modificação, o servidor retorna o recurso atualizado com status 200 e novas informações de cache.
Diretivas de Cache no Nginx
Diretiva expires
A diretiva expires controla o comportamento do cache, definindo os valores dos cabeçalhos HTTP Expires e Cache-Control nas respostas.
Sintaxe:
expires [modified] tempo;
expires epoch | max | off;
Valor padrão:
expires off;
Contexto: http, server, location
| Opção | Descrição |
|---|---|
| tempo | Define o tempo de expiração em segundos. Valores negativos definem Cache-Control: no-cache. Valores positivos ou zero definem Cache-Control: max-age=segundos |
| epoch | Define Expires para 1 de janeiro de 1970 e Cache-Control: no-cache |
| max | Define Expires para 31 de dezembro de 2037 e Cache-Control: max-age=315360000 (10 anos) |
| off | Não modifica os cabeçalhos de cache (comportamento padrão) |
Exemplo de configuração:
server {
listen 80;
server_name exemplo.com;
location /assets/ {
root /var/www/site;
expires 30d;
add_header Cache-Control "public";
}
location /api/ {
root /var/www/site;
expires -1;
add_header Cache-Control "no-store, no-cache, must-revalidate";
}
location /imagens/ {
root /var/www/site;
expires max;
}
}
Diretiva add_header
A diretiva add_header permite adicionar cabeçalhos personalizados às respostas HTTP.
Sintaxe:
add_header nome valor [always];
Valor padrão: nenhum
Contexto: http, server, location
O parâmetro always garante que o cabeçalho seja adicionado independentemente do código de status da resposta.
Valores de Cache-Control
O cabeçalho Cache-Control aceita as seguintes diretivas:
| Diretiva | Descrição |
|---|---|
| must-revalidate | Permite cache, mas exige validação com o servidor antes de reutilizra |
| no-cache | O cliente deve revalidar o recurso antes de usar a versão em cache |
| no-store | Proíbe armazenar qualquer parte da requisição ou resposta |
| no-transform | Proíbe intermediários de alterar o tipo de mídia do recurso |
| public | Permite que qualquer cache armazene a resposta |
| private | Apenas o cache do navegador pode armazenar a resposta |
| proxy-revalidate | Exige que caches intermediários revalidem a resposta |
| max-age=segundos | Define o tempo máximo de vida útil do cache |
| s-maxage=segundos | Define o tempo máximo de vida útil para caches compartilhados |