Configurando o Redis como um Cache Multicamadas Eficiente
Configure os limites de memória do cache Redis, política de despejo, TTLs e escolhas de persistência para um cache multicamadas confiável.
Configurando o Redis como um Cache Multicamadas Eficiente
O Redis é rápido porque mantém os dados de trabalho na memória, mas um cache não gerenciado ainda pode preencher o host e causar falhas de gravação. Quando você usa o Redis como um cache multicamadas entre seu aplicativo e um banco de dados mais lento, as decisões principais são limites de memória, política de despejo, disciplina de TTL e se os dados do cache devem ser persistidos.
Este guia foca na configuração do Redis para cargas de trabalho de cache, não para armazenamento primário de dados.
Entendendo as Camadas de Cache do Redis
Em muitos designs de aplicativos, o Redis é o cache compartilhado por trás de um cache em processo menor. Seu aplicativo pode manter alguns valores quentes localmente por milissegundos, enquanto o Redis armazena um conjunto maior de objetos reutilizáveis por segundos ou minutos. Isso torna o Redis a camada que protege seu banco de dados quando o tráfego aumenta.
Uma configuração eficiente depende de duas áreas principais:
- Gerenciamento de Memória: Definir um limite rígido de quanto memória o Redis pode consumir.
- Políticas de Despejo: Determinar como o Redis decide quais chaves remover quando o limite de memória é atingido.
1. Definindo Limites de Memória para Estabilidade
Evitar que o Redis consuma toda a memória disponível do sistema é fundamental para a estabilidade do host. A diretiva maxmemory define um teto absoluto para a memória alocada ao conjunto de dados (excluindo overhead). Se esse limite for atingido, o Redis começará a despejar chaves com base na política configurada.
Diretiva de Configuração: maxmemory
Essa configuração é crucial para ambientes de produção. Uma boa prática comum é deixar alguma margem para tarefas do sistema operacional e overhead do Redis (por exemplo, estruturas de dados internas, buffers de replicação).
Exemplo de Configuração (redis.conf):
# Define o uso máximo de memória para 4 Gigabytes
maxmemory 4gb
Dica: Sempre use sufixos legíveis (por exemplo,
100mb,2gb) para facilitar o gerenciamento da configuração.
Aplicação da Política de Memória
Se maxmemory estiver definido e maxmemory-policy permanecer como noeviction, comandos que precisam de mais memória podem falhar quando o limite for atingido. Para um cache, escolha uma política de despejo que permita ao Redis descartar entradas de cache antigas em vez de rejeitar gravações normais de cache.
2. Selecionando a Política de Despejo Correta (maxmemory-policy)
Esta diretiva define o algoritmo que o Redis usa para selecionar quais chaves remover quando o limite de memória é ultrapassado. Escolher a política correta depende muito dos padrões de acesso dos dados do seu aplicativo.
Políticas Voláteis vs. Não Voláteis
As políticas são geralmente categorizadas com base em se consideram a expiração do Tempo de Vida (TTL) definida nas chaves:
- Voláteis: Consideram apenas chaves que têm um tempo de expiração definido (
EXPIREouSETEX). - Todas as Chaves: Consideram todas as chaves, independentemente do TTL.
Para uma camada de cache pura, onde a maioria dos itens tem uma expiração explícita, as políticas voláteis são excelentes. Se você depende da lógica externa do aplicativo para gerenciar a obsolescência, pode preferir políticas não voláteis.
Principais Algoritmos de Despejo Explicados
A. Menos Recentemente Usado (LRU)
Esta é a política mais comum e muitas vezes padrão para cache geral. Ela remove a chave que não foi acessada por mais tempo. Funciona melhor quando os padrões de acesso seguem o princípio de localidade temporal (dados acessados recentemente provavelmente serão acessados novamente em breve).
Configuração:
maxmemory-policy allkeys-lru
B. Menos Frequentemente Usado (LFU)
O LFU rastreia a frequência com que uma chave foi acessada. Ele despeja chaves com menor frequência de acesso estimada. Isso funciona bem quando sua carga de trabalho tem um conjunto estável de chaves populares que devem sobreviver a varreduras ocasionais ou leituras únicas.
Configuração:
maxmemory-policy allkeys-lfu
C. Despejo Baseado em TTL
O despejo baseado em TTL é útil quando as chaves têm tempos de expiração significativos e as chaves mais próximas da expiração são as mais seguras de remover.
Configuração:
maxmemory-policy volatile-ttl
Esta política considera apenas chaves com uma expiração definida. Se muitas chaves não têm TTL, o Redis pode ficar sem chaves despejáveis e rejeitar gravações.
D. Despejo Aleatório
O despejo aleatório é simples e às vezes aceitável para dados de cache descartáveis, mas raramente é a primeira escolha quando seu cache tem padrões de acesso claros.
maxmemory-policy allkeys-random
3. Defina TTLs Consistentemente
As políticas de despejo são uma válvula de alívio de pressão, não sua única estratégia de invalidação de cache. A maioria das chaves de cache deve ter uma expiração que corresponda ao valor comercial dos dados.
Por exemplo, uma página de detalhes de produto pode armazenar em cache um fragmento renderizado por cinco minutos:
redis-cli SET product:123:html "$HTML" EX 300
Uma consulta de permissões de usuário pode precisar de um TTL muito mais curto porque dados obsoletos são mais arriscados:
redis-cli SET user:42:permissions "$JSON" EX 30
Evite misturar chaves permanentes no mesmo banco de dados Redis que chaves de cache descartáveis, a menos que você esteja usando uma política allkeys-* e esteja confortável com qualquer chave sendo despejada. Se alguns dados nunca devem ser despejados, mantenha-os em uma instância ou banco de dados Redis separado com uma política diferente.
4. Decida se a Persistência do Cache Ajuda
Para um cache puro, a persistência do Redis é opcional. Desabilitar RDB e AOF reduz a E/S de disco e a complexidade de reinicialização, mas toda chave de cache é perdida quando o Redis reinicia.
save ""
appendonly no
Isso é aceitável quando seu aplicativo pode reconstruir o cache a partir do banco de dados. Se o aquecimento do cache for caro ou um cache frio sobrecarregar o banco de dados, mantenha snapshots RDB ou AOF habilitados e teste o comportamento de reinicialização sob carga.
5. Monitore a Saúde do Cache
Use métricas do Redis para confirmar que o cache está ajudando:
redis-cli INFO memory
redis-cli INFO stats
redis-cli INFO keyspace
Observe estes campos em particular:
| Métrica | O que ela informa |
|---|---|
used_memory_human |
Memória atual consumida pelo Redis. |
maxmemory_human |
Teto de memória configurado. |
evicted_keys |
Se o Redis está despejando sob pressão. |
keyspace_hits e keyspace_misses |
Se o cache está servindo leituras úteis. |
expired_keys |
Se a limpeza de TTL está ativa. |
Se evicted_keys subir rapidamente e a taxa de acertos cair, aumente a memória, encurte os TTLs para chaves de baixo valor ou divida cargas de trabalho ruidosas em um cache separado.
Exemplo de Configuração de Cache
Este é um ponto de partida razoável para uma instância Redis dedicada a entradas de cache descartáveis:
maxmemory 4gb
maxmemory-policy allkeys-lfu
save ""
appendonly no
Para um cache onde cada chave tem um TTL cuidadosamente escolhido:
maxmemory 4gb
maxmemory-policy volatile-ttl
Use CONFIG GET maxmemory maxmemory-policy para verificar as configurações ativas:
redis-cli CONFIG GET maxmemory maxmemory-policy
Conclusão
Trate a configuração do cache Redis como um problema de controle de capacidade. Defina maxmemory, escolha uma política de despejo que corresponda ao seu padrão de acesso, dê TTLs explícitos às chaves do cache e decida se a persistência vale a E/S de disco. Em seguida, monitore a taxa de acertos, despejos e crescimento de memória para que o cache proteja seu banco de dados em vez de se tornar o próximo gargalo.