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.

Intermediário 25 min 20 pontos Leitura 0%

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?