Comparando as principais soluções do mercado
Redis vs Memcached
Compare Redis e Memcached em modelo de dados, persistência, operações atômicas e cenários de uso — a batalha clássica do cache em memória.
Nesta aula você vai
- Diferenciar arquitetura e filosofia de Redis e Memcached
- Comparar estruturas de dados, persistência e operações atômicas
- Decidir qual solução usar em cenários de cache puro versus cache rico
Redis vs Memcached
Objetivos
Nesta aula você vai:
- Entender a origem e filosofia de cada ferramenta
- Comparar capacidades técnicas lado a lado
- Saber quando Memcached ainda é a escolha certa — e quando Redis supera
Conteúdo
Dois poetas do silêncio rápido
Memcached, criado em 2003 por Brad Fitzpatrick para o LiveJournal, é o haiku do cache: breve, direto, sem ornamentos. Redis, de 2009, é o romance em prosa: mais verboso, com personagens complexos (listas, sets, streams) e enredo de persistência.
Ambos resolvem o problema fundamental de acelerar leituras mantendo dados em RAM. A divergência está no que cada um aceita fazer além do cache simples chave-valor.
Filosofia de design
| Princípio | Memcached | Redis |
|---|---|---|
| Modelo mental | "Cache burro e rápido" | "Estrutura de dados em memória" |
| Persistência | Nenhuma (volátil por design) | RDB, AOF, híbrido |
| Threading | Multi-thread nativo | Single-thread (com I/O threads opcionais) |
| Tamanho de valor | Até 1 MB | Até 512 MB |
| Replicação | Via cliente (consistent hashing) | Nativa (replicação master-replica) |
Modelo de dados: simplicidade versus riqueza
Memcached oferece apenas strings opacas (blob de bytes). Toda lógica de serialização e estrutura fica na aplicação:
# Memcached (via telnet ou mc CLI)
set sessao:abc 0 3600 128
{"usuario_id":42,"token":"xyz","expira":1720000000}
get sessao:abc
Redis oferece tipos nativos que a aplicação manipula diretamente:
# Redis — hash nativo (sem serializar JSON inteiro)
redis-cli HSET sessao:abc usuario_id 42 token xyz expira 1720000000
redis-cli HGETALL sessao:abc
redis-cli HINCRBY sessao:abc acessos 1
# Lista para fila simples
redis-cli LPUSH fila:emails "msg1"
redis-cli RPOP fila:emails
# Set para tags únicas
redis-cli SADD produto:1001:tags "eletronicos" "promocao"
redis-cli SMEMBERS produto:1001:tags
Tabela comparativa completa
| Recurso | Memcached | Redis |
|---|---|---|
| Tipos de dados | String apenas | String, Hash, List, Set, Sorted Set, Stream, etc. |
| TTL por chave | Sim | Sim |
| Operações atômicas | Apenas incr/decr | INCR, Lua scripts, transactions (MULTI/EXEC) |
| Pub/Sub | Não | Sim |
| Persistência | Não | RDB + AOF |
| Replicação | Não (client-side sharding) | Master-replica nativo |
| Cluster | Cliente faz consistent hashing | Redis Cluster nativo |
| Multi-thread | Sim (desde 1.6) | I/O threads (6.0+), comando single-thread |
| Uso de memória | Slab allocation (pode fragmentar) | Allocator jemalloc, overhead por tipo |
| Latência P50 típica | ~0,1 ms | ~0,1–0,3 ms |
| Latência P99 típica | ~0,5 ms | ~1–2 ms (com persistência AOF) |
Performance: o mito do "Memcached é sempre mais rápido"
Em benchmarks de GET/SET puro com valores pequenos, Memcached frequentemente empata ou supera Redis marginalmente — graças ao multi-threading e à simplicidade. Porém:
- Com valores grandes ou estruturas complexas, Redis evita serialização/deserialização na aplicação
- Com operações atômicas (INCR para rate limiting), Redis elimina race conditions que Memcached exigiria locks externos
- Com persistência desabilitada (
appendonly no), Redis compete de igual para igual
# Redis sem persistência para comparação justa
redis-cli CONFIG SET appendonly no
redis-cli CONFIG SET save ""
# Benchmark equivalente
redis-benchmark -t get,set -n 100000 -d 256 -c 50
Consistent hashing: como cada um escala
Memcached delega o sharding ao cliente. Bibliotecas como libmemcached distribuem chaves entre servidores via consistent hashing. Adicionar ou remover um nó causa remapeamento parcial de chaves.
Redis oferece Redis Cluster com 16384 hash slots gerenciados pelo próprio cluster. A migração de slots é coordenada internamente.
Memcached (client-side):
App → libmemcached → hash(key) → Servidor 1, 2 ou 3
Redis Cluster (server-side):
App → redis-cli/cluster → CRC16(key) mod 16384 → Slot → Nó responsável
Casos de uso: quem ganha cada cena
| Cenário | Vencedor | Por quê |
|---|---|---|
| Cache HTML de página estática | Memcached | Simples, multi-thread, sem overhead |
| Sessão de usuário com campos | Redis | Hash nativo, TTL, opcional persistência |
| Rate limiting (contador por IP) | Redis | INCR atômico + EXPIRE |
| Cache de resultado de query SQL | Empate | Ambos funcionam; Memcached se volume puro |
| Leaderboard em tempo real | Redis | Sorted Set (ZADD, ZRANGE) |
| Fila de jobs leve | Redis | LIST com LPUSH/BRPOP |
| Cache de objetos serializados (Java) | Memcached | Madura integração (Spymemcached) |
O argumento da operação
Memcached é notoriamente simples de operar: poucas configurações, poucos modos de falha, reinício sem consequências (dados voláteis). Redis exige mais atenção:
# Redis — verificações operacionais essenciais
redis-cli INFO memory
redis-cli INFO replication
redis-cli INFO persistence
redis-cli MEMORY STATS
redis-cli SLOWLOG GET 10
Para equipes pequenas que precisam apenas de cache volátil, Memcached reduz superfície operacional. Para equipes que querem uma ferramenta, múltiplos papéis (cache + fila + pub/sub + rate limit), Redis consolida infraestrutura.
Coexistência: usar ambos
Arquiteturas maduras às vezes empregam os dois:
┌─────────────────────────────────────────┐
│ Aplicação │
├─────────────────┬───────────────────────┤
│ Memcached │ Redis │
│ Cache de HTML │ Sessões + Rate Limit │
│ (multi-thread) │ (estruturas ricas) │
└─────────────────┴───────────────────────┘
Facebook (meta) historicamente usou Memcached em escala massiva para cache de página, enquanto Redis servia casos que exigiam estruturas mais ricas. A lição: não é religião, é engenharia.
Resumo
- Memcached é cache puro chave-valor, multi-thread, sem persistência — ideal para simplicidade
- Redis é estrutura de dados em memória com tipos ricos, persistência e replicação nativas
- Em GET/SET puro, performance é equivalente; Redis ganha quando precisa de operações atômicas ou tipos nativos
- Avalie custo operacional: Memcached é mais simples; Redis é mais versátil
Para refletir
"Memcached esquece de propósito; Redis lembra quando você pede. A escolha depende de quanto esquecimento seu sistema tolera."
Em um API gateway que precisa cachear respostas HTTP e limitar requisições por API key, você usaria um, outro ou ambos?