Comparando as principais soluções do mercado
Comparativo geral entre todas as soluções
Síntese comparativa de Redis, Valkey, Memcached, DragonflyDB, KeyDB e Aerospike com matriz de decisão, teorema CAP e guia de seleção arquitetural.
Nesta aula você vai
- Consolidar comparativos das aulas anteriores em uma visão unificada
- Aplicar o teorema CAP para posicionar cada solução
- Construir matriz de decisão para escolha arquitetural em projetos reais
Comparativo geral entre todas as soluções
Objetivos
Nesta aula você vai:
- Consolidar o panorama completo das soluções de cache e banco em memória
- Aplicar o teorema CAP como lente analítica
- Usar uma matriz de decisão para escolher a ferramenta certa em cada cenário
Conteúdo
O epílogo do módulo comparativo
Depois de examinar cada personagem individualmente — Redis, Valkey, Memcached, DragonflyDB, KeyDB e Aerospike — chegamos ao capítulo final em que todos ocupam o mesmo palco. Como em um romance de ficção científica, cada tecnologia representa uma resposta diferente à pergunta fundamental: o que você sacrifica quando exige velocidade?
Panorama das soluções
| Solução | Tipo | Threading | Persistência | Licença | Maturidade |
|---|---|---|---|---|---|
| Redis | Estrutura de dados em memória | Single-thread + I/O | RDB + AOF | RSALv2/SSPL | ★★★★★ |
| Valkey | Fork Redis open source | Single-thread + I/O | RDB + AOF | BSD-3-Clause | ★★★★ |
| Memcached | Cache chave-valor | Multi-thread | Nenhuma | BSD | ★★★★★ |
| DragonflyDB | Redis-compatible | Multi-thread nativo | Snapshot | BSL → Apache | ★★★ |
| KeyDB | Fork Redis multi-thread | Multi-thread | RDB + AOF | BSD-3-Clause | ★★★ |
| Aerospike | Banco NoSQL híbrido | Multi-thread | SSD nativo | AGPL/Enterprise | ★★★★ |
O teorema CAP aplicado
O teorema CAP (Brewer) afirma que um sistema distribuído só pode garantir simultaneamente duas de três propriedades:
- Consistency (Consistência) — todos os nós veem os mesmos dados ao mesmo tempo
- Availability (Disponibilidade) — toda requisição recebe resposta (não erro)
- Partition tolerance (Tolerância a partição) — sistema funciona mesmo com falha de rede entre nós
Em sistemas distribuídos reais (com partição de rede inevitável), a escolha é entre CP e AP:
Consistência (C)
▲
│
Aerospike │ Redis/Valkey
(sync rep) │ (sync rep)
│
Partition ───────────┼─────────── Disponibilidade (A)
Tolerance (P) │
│
AP systems │ Memcached
(eventual) │ (sem replicação nativa)
│
▼
| Solução | Tendência CAP | Comportamento em partição |
|---|---|---|
| Redis/Valkey (repl. sync) | CP | Pode recusar escritas se quorum indisponível |
| Memcached | AP (sem repl.) | Nó isolado continua servindo cache local |
| KeyDB (Active Replication) | AP | Last-write-wins em conflito |
| DragonflyDB | CP (single node) / em evolução | Depende da topologia |
| Aerospike (repl. sync) | CP | Escrita falha se réplica indisponível (configurável) |
Nota pedagógica: CAP é modelo de pensamento, não receita de bololo. Na prática, sistemas modernos oferecem níveis configuráveis de consistência (ex.: Redis WAIT, Aerospike strong vs eventual).
Matriz de decisão por caso de uso
| Caso de uso | 1ª escolha | 2ª escolha | Evitar |
|---|---|---|---|
| Cache HTTP simples | Memcached | Redis | Aerospike |
| Sessão de usuário | Redis/Valkey | KeyDB | Memcached (sem estruturas) |
| Rate limiting | Redis/Valkey | DragonflyDB | Memcached |
| Leaderboard | Redis (Sorted Set) | — | Memcached |
| Pub/Sub efêmero | Redis | — | Memcached |
| Fila leve (jobs) | Redis (LIST/Stream) | — | Memcached |
| Cache + persistência | Redis/Valkey | KeyDB | Memcached |
| Throughput extremo (1 nó) | DragonflyDB | KeyDB | Redis single-thread |
| Multi-master writes | KeyDB | — | Redis tradicional |
| Dados > RAM (TB) | Aerospike | — | Redis puro |
| Perfis em escala (100M+) | Aerospike | Redis Cluster | Memcached |
| Licença BSD estrita | Valkey/KeyDB | Memcached | Redis 7.4+ |
| Ecossistema maduro | Redis/Valkey | Memcached | DragonflyDB |
Comparativo de performance (referência)
Valores ilustrativos em servidor 16 cores, 64 GB RAM, valores de 256 bytes:
| Solução | GET ops/s | SET ops/s | P50 | P99 |
|---|---|---|---|---|
| Memcached | ~250.000 | ~200.000 | 0,1 ms | 0,5 ms |
| Redis 7.2 | ~120.000 | ~100.000 | 0,3 ms | 1,5 ms |
| Valkey 8.0 | ~125.000 | ~105.000 | 0,3 ms | 1,2 ms |
| KeyDB (8 threads) | ~500.000 | ~400.000 | 0,15 ms | 0,8 ms |
| DragonflyDB | ~1.200.000 | ~1.000.000 | 0,1 ms | 0,6 ms |
| Aerospike | ~300.000 | ~250.000 | 0,5 ms | 3 ms |
Aerospike inclui persistência SSD. Redis com AOF everysec. Sempre benchmark no seu ambiente.
# Script de benchmark comparativo (executar contra cada instância)
for host in redis valkey keydb dragonfly memcached; do
echo "=== $host ==="
redis-benchmark -h $host -p 6379 -t get,set -n 100000 -q
redis-cli -h $host --latency-history -i 1 | head -5
done
Comparativo de latência por percentil
Entender percentis é essencial para SLAs de produção:
| Percentil | O que mede | Por que importa |
|---|---|---|
| P50 (mediana) | Experiência típica | Baseline de performance |
| P95 | 5% mais lento | Usuários afetados em picos moderados |
| P99 | 1% mais lento | "Cauda longa" — onde incidentes nascem |
| P99.9 | 0,1% mais lento | Outliers extremos — SLA crítico |
Distribuição de latência (ilustrativa):
Frequência
▲
│ ████
│ ████████
│ ████████████
│ ████████████████▓▓▓▓░░ ← cauda longa (P99+)
└──────────────────────────► Latência
P50 P95 P99 P99.9
Regra de ouro: otimize para P99, não para média. Um P50 de 0,2 ms com P99 de 50 ms indica problema (GC, persistência, rede) — não excelência.
Comparativo de custo operacional
| Fator | Memcached | Redis/Valkey | DragonflyDB/KeyDB | Aerospike |
|---|---|---|---|---|
| Complexidade de deploy | Baixa | Média | Média | Alta |
| Curva de aprendizado | Baixa | Média | Média | Alta |
| Monitoramento | Básico | Rico (INFO, SLOWLOG) | Compatível Redis | Métricas próprias |
| Backup/restore | Desnecessário | RDB/AOF | Snapshot | SSD nativo |
| Scaling horizontal | Client-side | Redis Cluster | Limitado | Automático |
| Custo de RAM | Alto (tudo em RAM) | Alto | Alto | Médio (híbrido) |
Árvore de decisão
Precisa de cache?
├── Sim → Dados cabem em RAM?
│ ├── Sim → Precisa de estruturas ricas (hash, sorted set)?
│ │ ├── Sim → Precisa multi-thread?
│ │ │ ├── Sim → DragonflyDB ou KeyDB
│ │ │ └── Não → Redis ou Valkey
│ │ └── Não → Memcached
│ └── Não → Aerospike
└── Não → Considere PostgreSQL, Kafka, etc.
Coexistência: arquitetura políglota de dados
Sistemas maduros raramente escolhem uma única solução:
┌─────────────────────────────────────────────────────────┐
│ Camada de Aplicação │
├──────────┬──────────┬──────────┬──────────┬─────────────┤
│Memcached │ Redis │ KeyDB/ │Aerospike │ PostgreSQL │
│ Cache │ Sessão + │Dragonfly │ Perfis + │ Pedidos + │
│ de página│ Rate Lim │(through) │ Inventár.│ Relatórios │
└──────────┴──────────┴──────────┴──────────┴─────────────┘
Cada ferramenta resolve um capítulo do enredo — não tente escrever o livro inteiro com um único personagem.
Checklist de seleção
Antes de decidir, responda:
- Volume de dados — cabe em RAM? (< 100 GB → Redis; > 500 GB → Aerospike)
- Padrão de acesso — chave-valor simples ou estruturas ricas?
- Durabilidade — perda de dados é aceitável? (sim → Memcached; não → Redis/Aerospike)
- Throughput — quantas ops/s? (> 500k em 1 nó → DragonflyDB/KeyDB)
- Consistência — CP ou AP? (financeiro → CP; cache → AP)
- Licença — BSD obrigatório? (Valkey, KeyDB, Memcached)
- Equipe — experiência existente com qual ferramenta?
- SLA de latência — qual P99 é aceitável?
Resumo
- Não existe "melhor" solução universal — existe a melhor para cada contexto
- CAP ajuda a posicionar trade-offs: CP (Redis, Aerospike) vs AP (Memcached, KeyDB active)
- Otimize decisões por P99, não por ops/s de marketing
- Arquiteturas maduras combinam múltiplas ferramentas — poliglotismo é força, não fraqueza
Para refletir
"O arquiteto não escolhe a ferramenta mais rápida — escolhe a que o time opera bem, o negócio tolera e o orçamento sustenta."
Desenhe a arquitetura de cache de um SaaS com 10.000 clientes, 50 GB de sessões e 200 GB de perfis: quais soluções você combinaria?