Resumo
Imagine um e-commerce em que toda visita à página de um produto dispara uma query no banco de dados relacional para buscar preço, estoque e descrição. Em um dia normal isso funciona. Numa liquidação, com 50x mais acessos batendo nos mesmos produtos em destaque, o banco satura — não porque os dados mudaram, mas porque a mesma pergunta está sendo respondida milhares de vezes por segundo.
ElastiCache resolve esse tipo de problema: é um serviço gerenciado de cache em memória, que guarda dados frequentemente acessados perto da aplicação (em RAM, não em disco), reduzindo drasticamente a latência e tirando carga repetitiva do banco de dados.
- ElastiCache: serviço gerenciado que provisiona, opera e escala engines de cache em memória — sem você administrar servidor, patch ou failover manualmente.
- Redis: engine rica em funcionalidades — estruturas de dados avançadas, persistência, replicação, transações, pub/sub. É a escolha padrão quando você não tem certeza de qual usar.
- Memcached: engine mais simples — multi-threaded, sem persistência, sem replicação nativa. Ideal para cache puro e descartável, distribuído horizontalmente por sharding simples.
- Cache-aside (lazy loading): o padrão de uso mais comum — a aplicação consulta o cache primeiro; se não encontrar (cache miss), busca no banco e grava o resultado no cache para a próxima vez.
1. Por que usar cache — o problema, na prática
Bancos de dados relacionais (RDS, Aurora) são ótimos para consistência e consultas complexas, mas ler do disco (ou mesmo de um buffer pool) sob alta concorrência tem um custo: latência de alguns milissegundos por query, multiplicada por milhares de requisições repetidas para os mesmos dados.
Um cache em memória resolve isso guardando o resultado de uma consulta cara, disponível em microssegundos numa segunda leitura. Os ganhos típicos:
- Latência: leituras em memória são ordens de magnitude mais rápidas que leituras em disco.
- Redução de carga no banco: cada leitura respondida pelo cache é uma query a menos no RDS/Aurora — ajuda a adiar (ou evitar) upgrades de instância só por volume de leitura repetitiva.
- Escalabilidade de leitura barata: é mais barato escalar nós de cache do que escalar réplicas de um banco relacional para o mesmo volume de leituras repetidas.
O ElastiCache entrega isso como serviço gerenciado: a AWS cuida de provisionamento de nós, patching, monitoramento, failover (quando configurado) e backups — você foca em decidir o que cachear e por quanto tempo.
2. Redis vs Memcached — a decisão central
Essa comparação é, de longe, o ponto mais cobrado da prova sobre ElastiCache.
| Característica | Redis | Memcached |
|---|---|---|
| Estruturas de dados | Strings, Lists, Hashes, Sets, Sorted Sets, Streams | Apenas pares chave-valor simples (strings) |
| Persistência | Sim (RDB snapshots e/ou AOF) | Não — dados somem se o nó reiniciar |
| Replicação | Sim (réplicas de leitura, Multi-AZ com failover automático) | Não nativa |
| Multi-AZ com failover automático | Sim | Não |
| Transações | Sim (MULTI/EXEC) | Não |
| Pub/Sub | Sim | Não |
| Arquitetura de processo | Single-threaded (por nó/shard) | Multi-threaded |
| Particionamento (sharding) | Sim, via Cluster Mode | Sim, nativo — a aplicação distribui entre nós |
| Backup e restore | Sim, snapshots geridos pela AWS | Não |
| Ordenação/rank (ex: leaderboard) | Sim, via Sorted Sets | Não |
Regra prática para a prova: se a questão menciona qualquer uma dessas palavras — persistência, replicação, Multi-AZ, failover automático, transações, pub/sub, estruturas de dados complexas, leaderboard/ranking — a resposta é Redis. Se a questão descreve cache simples, descartável, que precisa de multi-threading para aproveitar múltiplos núcleos de CPU num único nó, e sharding simples e massivo sem se importar com perda de dados em um restart, a resposta é Memcached.
3. Estratégias de caching
Como o cache é preenchido e mantido atualizado importa tanto quanto qual engine usar.
3.1 Lazy loading (cache-aside)
O padrão mais usado. Fluxo:
- Aplicação pede o dado ao cache.
- Cache hit: dado está lá, retorna direto — rápido.
- Cache miss: dado não está no cache. Aplicação busca no banco de dados, retorna ao usuário e grava o resultado no cache para a próxima leitura.
Vantagens: só armazena dados que realmente são solicitados (eficiente em memória); se o nó de cache cair, a aplicação continua funcionando (mais lenta, buscando direto no banco) até o cache voltar.
Desvantagem: a primeira leitura de qualquer dado sempre é um cache miss (mais lenta) — e dados no cache podem ficar desatualizados (stale) se o banco mudar sem que o cache seja invalidado.
3.2 Write-through
A cada escrita no banco, a aplicação também escreve no cache, mantendo os dois sempre sincronizados.
Vantagem: o cache nunca fica desatualizado — dados sempre consistentes com o banco.
Desvantagem: toda escrita fica mais lenta (grava em dois lugares); dados que nunca são lidos ocupam espaço no cache desnecessariamente; se o nó de cache estiver fora, a estratégia mais simples de write-through falha a escrita ou exige lógica extra de contingência.
3.3 TTL (Time To Live)
Complementa qualquer uma das estratégias acima: define um tempo de expiração para cada chave. Depois desse tempo, o dado é removido automaticamente do cache, forçando uma releitura (e atualização) do banco na próxima consulta.
💡 Regra prática para a prova: lazy loading é o padrão default recomendado (resiliente a falha do cache, eficiente em memória) — combine com TTL para evitar dados eternamente desatualizados. Write-through entra quando a consistência entre cache e banco é crítica e você pode aceitar escrita mais lenta.
4. Arquitetura do Redis no ElastiCache
4.1 Cluster Mode Disabled
Um único shard (grupo primário + até 5 réplicas de leitura), replicando de forma assíncrona a partir de um nó primário. Todas as escritas vão para o primário; leituras podem ser distribuídas entre as réplicas para escalar throughput de leitura.
- Escala leitura adicionando réplicas.
- Não escala escrita horizontalmente — o primário é o único ponto de escrita, limitado pela memória de um único nó.
4.2 Cluster Mode Enabled
Os dados são particionados (sharded) entre até 500 shards, cada shard com seu próprio primário e réplicas opcionais. As chaves são distribuídas entre shards por hash slots.
- Escala escrita e leitura horizontalmente, porque cada shard tem seu próprio nó primário.
- É a opção correta quando o volume de dados ou de escrita excede a capacidade de um único nó primário.
4.3 Multi-AZ e failover automático
Com Multi-AZ habilitado, se o nó primário de um shard falhar, o ElastiCache promove automaticamente uma réplica a primário — sem intervenção manual — minimizando downtime. Sem Multi-AZ, uma falha no primário exige intervenção manual para restaurar a capacidade de escrita.
4.4 Global Datastore
Permite replicação entre regiões: um cluster Redis primário replica de forma assíncrona para clusters secundários em outras regiões AWS, útil para aplicações globais que precisam de leitura de baixa latência perto do usuário, ou para disaster recovery entre regiões.
5. Arquitetura do Memcached no ElastiCache
Memcached não tem conceito de primário/réplica — todos os nós de um cluster são independentes e equivalentes. A distribuição dos dados entre eles é feita pelo cliente (via hashing consistente na biblioteca cliente), não pelo servidor.
- Auto Discovery: recurso do ElastiCache que permite ao cliente descobrir automaticamente todos os nós do cluster sem precisar de configuração manual de endpoints a cada mudança.
- Adicionar ou remover nós redistribui as chaves entre os nós disponíveis (o cliente recalcula o hashing) — não há cópia automática de dados entre nós, então um scale-in ou falha de nó perde os dados daquele nó (sem impacto de correção, porque é cache, mas com impacto em performance até o cache "esquentar" de novo).
- Sem persistência: um restart de nó (ou falha) apaga os dados daquele nó — a aplicação simplesmente vai ter mais cache misses até repopular.
6. Persistência no Redis
Só o Redis oferece isso — é um dos motivos centrais para escolhê-lo quando dados de cache não podem simplesmente desaparecer numa falha.
- RDB (Redis Database) snapshots: fotografias periódicas de todo o dataset, salvas em S3 de forma gerenciada. Permitem restaurar o cluster a partir de um ponto no tempo, mas dados escritos entre o último snapshot e uma falha são perdidos.
- AOF (Append Only File): registra cada operação de escrita à medida que acontece, permitindo uma recuperação mais granular. Tem mais overhead de I/O do que RDB.
- Backup and restore: snapshots RDB também podem ser usados para criar um novo cluster a partir de um backup — por exemplo, para popular um ambiente de testes com uma cópia dos dados de produção.
⚠️ Mesmo com persistência habilitada no Redis, o ElastiCache continua sendo cache — não é indicado como fonte única de verdade para dados que precisam de garantias fortes de durabilidade como um banco transacional (RDS/Aurora/DynamoDB). Persistência aqui existe para acelerar recuperação após falha, não para substituir o banco primário.
7. Eviction policies — o que fazer quando o cache enche
Quando a memória do nó atinge o limite (maxmemory), o Redis precisa decidir o que remover para abrir espaço para novas chaves. Algumas políticas comuns (maxmemory-policy):
- allkeys-lru: remove a chave menos recentemente usada entre todas as chaves — boa política default para cache genérico.
- volatile-lru: remove a menos recentemente usada, mas só entre chaves que têm TTL configurado — chaves sem expiração nunca são removidas por essa política.
- noeviction: não remove nada; novas escritas passam a falhar com erro quando a memória enche — útil quando o Redis está sendo usado para algo além de cache puro (ex: fila), onde perder dados silenciosamente seria pior que falhar a escrita.
8. Segurança
- Encryption at rest: criptografa os dados armazenados em disco (relevante para snapshots RDB e AOF) usando KMS.
- Encryption in transit: criptografa a comunicação entre a aplicação e o cluster (TLS) — tem impacto de performance, mas protege dados sensíveis trafegando pela rede.
- Redis AUTH: exige uma senha (token) para qualquer cliente se conectar ao cluster Redis — camada extra além do controle de rede.
- IAM authentication (Redis): alternativa mais moderna ao AUTH token, permitindo autenticação e autorização usando políticas IAM em vez de gerenciar uma senha compartilhada.
- VPC e Security Groups: por padrão, clusters ElastiCache rodam dentro de uma VPC, isolados de acesso público — o acesso é controlado por security groups, exatamente como em uma instância EC2 ou RDS.
- Memcached não possui AUTH nativo equivalente ao Redis — o isolamento de rede via VPC/security group é a principal camada de proteção.
9. Casos de uso comuns
- Cache de resultados de banco de dados: o caso clássico — cachear resultados de queries caras e repetitivas (lazy loading + TTL).
- Session store: guardar sessões de usuário fora da própria instância da aplicação, permitindo que qualquer instância atrás de um load balancer atenda qualquer usuário sem "session stickiness" — essencial em arquiteturas stateless com Auto Scaling.
- Leaderboards e ranking em tempo real: usando Sorted Sets do Redis, que mantêm elementos ordenados automaticamente por um score (ex: pontuação de um jogo), com operações eficientes de "top N" ou "posição de um jogador".
- Pub/Sub: Redis permite publicar mensagens em canais e ter múltiplos assinantes reagindo em tempo real — usado para notificações e comunicação leve entre componentes.
- Rate limiting / contadores: operações atômicas de incremento (
INCR) no Redis são úteis para controlar taxas de requisição por usuário/API key.
10. Boas práticas
- Use Redis como escolha default quando houver dúvida — a menos que a simplicidade e o multi-threading do Memcached sejam especificamente necessários.
- Combine lazy loading com TTL para a maioria dos casos — é a estratégia mais resiliente e eficiente em memória.
- Habilite Multi-AZ com failover automático em Redis sempre que o cache for crítico para a disponibilidade da aplicação (ex: session store).
- Use Cluster Mode Enabled quando o volume de dados ou de escrita ultrapassar a capacidade de um único nó primário.
- Nunca trate o ElastiCache como fonte única de verdade para dados que exigem durabilidade forte — ele é um acelerador, não um substituto do banco primário.
- Monitore métricas do CloudWatch como
CacheHitRate,EvictionseCurrConnectionspara saber se o tamanho do cluster está adequado ao padrão de acesso real.
11. Exercícios e revisão
- Explique por que uma aplicação de leaderboard de jogo deveria usar Redis em vez de Memcached, citando a estrutura de dados específica envolvida.
- Compare o comportamento de lazy loading e write-through diante de uma falha temporária do cluster de cache.
- Descreva um cenário em que
noevictionseria mais apropriado queallkeys-lru. - Explique a diferença entre Cluster Mode Disabled e Cluster Mode Enabled em termos de escalabilidade de escrita.
Questão 1
Uma aplicação precisa de um cache que suporte replicação, failover automático e persistência de dados em disco. Qual engine do ElastiCache atende a esses requisitos?
Questão 2
Uma equipe precisa de um cache simples, descartável, para acelerar leituras repetitivas, aproveitando múltiplos núcleos de CPU em um único nó através de multi-threading, sem necessidade de persistência ou replicação. Qual engine é mais adequada?
Questão 3
Em uma estratégia de **lazy loading (cache-aside)**, o que acontece em um cache miss?
Questão 4
Qual é a principal desvantagem da estratégia de **write-through** em comparação com lazy loading?
Questão 5
Um cluster Redis está configurado em **Cluster Mode Disabled**. A aplicação começa a sofrer gargalo porque o volume de **escritas** já ultrapassa a capacidade de um único nó primário. Qual mudança resolve esse problema?
Questão 6
O que acontece quando o nó primário de um shard Redis falha, em um cluster com **Multi-AZ habilitado**?
Questão 7
Uma aplicação global precisa que usuários em diferentes continentes leiam dados de cache com baixa latência local, a partir de um cluster Redis primário que replica os dados entre regiões. Qual recurso do ElastiCache atende a esse requisito?
Questão 8
Qual estrutura de dados do Redis é mais adequada para implementar um leaderboard de jogo em tempo real, com consultas eficientes de "top 10 jogadores"?
Questão 9
Um cluster Redis está sendo usado para armazenar sessões de usuário críticas para a aplicação. A equipe quer garantir que, se a memória do nó encher, novas escritas falhem explicitamente em vez de sessões existentes serem removidas silenciosamente. Qual `maxmemory-policy` atende a esse requisito?
Questão 10
Por que o ElastiCache **não** deve ser usado como fonte única de verdade para dados que exigem forte durabilidade, mesmo com persistência Redis habilitada?
Questão 11
Em um cluster Memcached, como os dados são distribuídos entre os nós?
Questão 12
Uma equipe está adicionando e removendo nós de um cluster Memcached com frequência, e clientes precisam saber os endpoints atuais de todos os nós sem reconfiguração manual constante. Qual recurso do ElastiCache resolve isso?
Questão 13
Qual das opções abaixo descreve corretamente a arquitetura de processamento do Redis em comparação com o Memcached?
Questão 14
Uma aplicação precisa gerenciar sessões de usuário fora das instâncias EC2, para que qualquer instância atrás de um Application Load Balancer possa atender qualquer usuário, sem depender de session stickiness. Qual uso do ElastiCache atende diretamente a esse requisito?
Questão 15
Para proteger dados sensíveis trafegando entre a aplicação e um cluster Redis contra interceptação na rede, qual recurso deve ser habilitado?
Questão 16
Qual mecanismo de persistência do Redis registra cada operação de escrita conforme ela acontece, oferecendo recuperação mais granular do que snapshots periódicos, ao custo de mais overhead de I/O?
Questão 17
Uma aplicação de alta escala está sofrendo com queries repetidas e idênticas ao banco de dados para os mesmos produtos em destaque durante um evento de tráfego intenso. Qual combinação de estratégia e engine é mais indicada para reduzir a carga no banco sem exigir que a aplicação gerencie replicação manualmente?
Questão 18
Um cluster Redis crítico precisa de alta disponibilidade com failover automático **e** de escalar volume de escrita além da capacidade de um único nó. Qual configuração atende a ambos os requisitos simultaneamente?
Questão 19
Por que TTL é frequentemente combinado com a estratégia de lazy loading, mesmo sendo uma estratégia "resiliente" por padrão?
Questão 20
Uma arquitetura precisa simultaneamente: cache com estruturas de dados avançadas para ranking de usuários, alta disponibilidade com failover automático em caso de falha do nó primário, persistência para recuperação rápida após uma reinicialização planejada, e capacidade de escrita que ultrapassa um único nó devido ao volume de dados. Qual configuração do ElastiCache atende a todos esses requisitos ao mesmo tempo?
Laboratório Prático
Objetivo: criar um cluster ElastiCache Redis com Multi-AZ habilitado e validar a estratégia de lazy loading a partir de uma aplicação simples.
Pré-requisitos: uma VPC com pelo menos 2 subnets privadas em AZs diferentes; uma instância EC2 (ou Cloud9) na mesma VPC para testar a conexão.
Tempo estimado: 25 minutos
Possíveis custos: o cluster ElastiCache fica ativo durante o laboratório — lembre-se de fazer a limpeza ao final para não gerar cobrança contínua. Custo aproximado de poucos centavos se limpo em até 1 hora.
Passos:
- No console do ElastiCache, crie um subnet group apontando para as subnets privadas da sua VPC.
- Crie um cluster Redis com um nó primário
cache.t3.micro, 1 réplica de leitura, e Multi-AZ com failover automático habilitado. - Configure um security group que permita tráfego na porta
6379apenas a partir do security group da sua instância EC2 de teste. - Na instância EC2, instale um cliente Redis (ex:
redis-clioupip install redispara Python) e conecte-se usando o endpoint primário do cluster. - Escreva um script simples simulando lazy loading: consulte uma chave; se não existir (cache miss), simule uma "busca no banco" (ex:
time.sleep(1)retornando um valor fixo) e grave o resultado no cache comSETEX chave 60 valor(TTL de 60 segundos). - Execute o script duas vezes seguidas e compare o tempo de resposta — a segunda execução deve ser praticamente instantânea (cache hit).
- No console, force um failover manual do nó primário (opção "Test Failover") e observe uma réplica sendo promovida automaticamente, sem downtime perceptível para leituras nas réplicas restantes.
Resultado esperado: a segunda leitura da mesma chave retorna quase instantaneamente (cache hit), comprovando o ganho de latência do cache; e o failover de teste demonstra a troca automática de primário sem intervenção manual.
Limpeza dos recursos: delete o cluster Redis, depois o subnet group do ElastiCache, para evitar dependências travadas.
Referências:
- ElastiCache overview: https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/WhatIs.html
- Redis vs Memcached: https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/SelectEngine.html
- Caching strategies: https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Strategies.html
- Redis replication: https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Replication.html
- Redis backup and restore: https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/backups.html
- Global Datastore: https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Redis-Global-Datastore.html