Estratégia de cache com Redis: chaves, TTL, invalidação e stampede
Decide o que guardar em cache no Redis e como: padrão por tipo de dado, nomes de chaves, TTL com jitter, invalidação, proteção contra stampede, política de memória e código de exemplo. Pensado para ChatGPT, Claude, Gemini e Microsoft Copilot. Inclui 4 variáveis personalizáveis e pode copiá-lo gratuitamente com um clique.
Avançado · Código · Pendente de revisão editorial
Prompt
Atua como arquiteto backend especializado em desempenho e em cache com Redis.
Contexto:
- Aplicação e stack: {{aplicacao}}
- Dados candidatos a cache e o seu padrão de leitura e escrita: {{dados}}
- Tolerância a dados desatualizados: {{tolerancia}}
- Problema atual: {{problema}}
Entregáveis:
1. O que guardar em cache e o que não: uma tabela com cada dado, rácio leitura/escrita estimado (ou [PREENCHER] se eu não souber), custo de recalcular e decisão.
2. O padrão para cada dado (cache-aside, read-through, write-through ou write-behind) e porquê.
3. Esquema de chaves: convenção de nomes, prefixo de versão para invalidar em bloco e como evitar um crescimento ilimitado de chaves.
4. TTL por tipo de dado, com jitter para não expirarem todas ao mesmo tempo.
5. Invalidação: que eventos apagam ou atualizam cada chave, como evitar condições de corrida entre a escrita na base de dados e na cache, e o que acontece se a invalidação falhar.
6. Proteção contra cache stampede: bloqueio com `SET NX` e expiração, atualização antecipada probabilística ou servir o dado expirado enquanto se recalcula.
7. Configuração do Redis: `maxmemory`, política de expulsão adequada, serialização e tamanho máximo dos valores.
8. Comportamento se o Redis não responder: timeouts curtos, recurso à base de dados e proteção desta contra sobrecarga.
9. Métricas a medir (taxa de acertos, latência, expulsões, memória) e um plano de implementação gradual.
10. Código de exemplo na minha stack para o caso principal, com a proteção contra stampede incluída.
Restrições:
- Não dês números de melhoria inventados; explica como medir antes e depois.
- Se faltar informação sobre volume ou consistência, pergunta-me antes de recomendar.
- Assinala os dados que nunca devem ficar em cache partilhada (por exemplo dados pessoais de outro utilizador).Como utilizar
- Lista os endpoints ou consultas mais lentos ou mais chamados e a frequência com que os dados mudam.
- Indica quanto tempo cada dado pode ficar desatualizado sem causar problemas.
- Implementa a cache primeiro num só caso, mede a taxa de acertos e depois alarga.
Exemplo de utilização
App: loja Laravel em PHP 8.3 · Dados: catálogo (muda poucas vezes por dia) e stock (muda a cada minuto) · Problema: a página de categoria demora 1,8 s nas horas de ponta.
Exemplo de resultado
1. O que pôr em cache
| Dado | Leitura/escrita | Decisão |
|---|---|---|
| Catálogo por categoria | Muito alta / poucas por dia | Cache-aside, TTL ~10 min |
| Stock | Alta / a cada minuto | TTL de 30 s ou ler do MySQL |
| Carrinho | Por utilizador | Chave por utilizador, nunca partilhada |
| Preço no checkout | — | Sem cache: sempre do MySQL |
10. Código: catálogo com proteção contra stampede
public function produtosDaCategoria(int $categoriaId): array
{
$versao = Cache::get('catalogo:versao', 1); // incrementá-la invalida todo o catálogo
$chave = "v{$versao}:categoria:{$categoriaId}:produtos";
$ttl = 600 - random_int(0, 60); // jitter para não expirarem todas ao mesmo tempo
if (($emCache = Cache::get($chave)) !== null) {
return $emCache;
}
// Só um processo recalcula; os restantes esperam até 3 s
return Cache::lock("lock:{$chave}", 10)->block(3, fn () =>
Cache::remember($chave, $ttl, fn () => Product::query()
->where('category_id', $categoriaId)
->where('active', true)
->get(['id', 'name', 'slug', 'image'])
->toArray())
);
}
Se block() lançar LockTimeoutException, serve a última cópia ou consulta o MySQL com limite de concorrência. Mede a taxa de acertos e a latência p95 da página antes e depois do rollout…
Dados-chave
- Categoria
- Programação e desenvolvimento · Arquitetura de software
- Tipo de resultado
- Código
- Nível
- Avançado
- Pensado para
- ChatGPT, Claude, Gemini e Microsoft Copilot
- Verificado em
- Pendente de verificação editorial
- Variáveis
- Aplicação e stack, Dados e padrão de acesso, Tolerância a dados antigos e Problema atual
- Idioma
- Português
- Preço
- Gratuito, sem registo
- Atualizado
- 07/11/2026
Perguntas frequentes
O que é um cache stampede?
Acontece quando uma chave muito usada expira e centenas de pedidos tentam recalculá-la ao mesmo tempo, sobrecarregando a base de dados. Evita-se com um bloqueio para que só um a regenere, ou atualizando-a antes de expirar.
Porquê acrescentar jitter ao TTL?
Chaves criadas ao mesmo tempo com o mesmo TTL expiram juntas e provocam um pico de carga. Uma pequena margem aleatória distribui essas expirações.
Que política de expulsão escolho no Redis?
Se o Redis for só cache, allkeys-lru ou allkeys-lfu costumam servir. Se partilhar a instância com dados que não se podem perder, como filas, separa-os noutra instância.
Para que serve este prompt?
Decide o que guardar em cache no Redis e como: padrão por tipo de dado, nomes de chaves, TTL com jitter, invalidação, proteção contra stampede, política de memória e código de exemplo.
Com que ferramentas de IA funciona?
Foi pensado para ChatGPT, Claude, Gemini e Microsoft Copilot. Ainda não o verificámos nestas ferramentas, pelo que os resultados podem variar entre elas.
Como personalizo o prompt?
Clique em “Personalizar” e preencha as variáveis (Aplicação e stack, Dados e padrão de acesso, Tolerância a dados antigos e Problema atual). O texto atualiza-se instantaneamente e pode depois copiá-lo com um clique. Os valores ficam guardados apenas no seu navegador.
Preciso de experiência para o utilizar?
É de nível avançado: destina-se a pessoas com experiência no tema, capazes de avaliar e ajustar o resultado.
Este prompt é gratuito?
Sim. Todos os prompts do HomeCasa Prompts são gratuitos, sem registo nem subscrição. Pode também utilizá-los em projetos profissionais.
Posso confiar no resultado da IA?
Trate-o como um rascunho de qualidade: verifique sempre os dados, os números e as afirmações importantes antes de publicar ou tomar decisões.