Redis: O padrão da indústria
Estruturas de dados do Redis
Aprenda Strings, Hashes, Lists, Sets, Sorted Sets, Streams, Bitmaps, HyperLogLog e Geospatial.
Nesta aula você vai
- Dominar strings, hashes, lists, sets, sorted sets e streams do Redis
- Escolher a estrutura adequada conforme padrão de acesso e cardinalidade
- Aplicar comandos atômicos que reduzem lógica na camada de aplicação
Estruturas de dados do Redis
Objetivos
Nesta aula você vai:
- Conhecer cada tipo nativo do Redis e seus comandos fundamentais
- Relacionar estruturas a casos de uso reais (sessão, fila, ranking, event log)
- Evitar armadilhas de complexidade algorítmica e modelagem incorreta
Introdução
O diferencial competitivo do Redis sobre caches simples está nas estruturas de dados nativas: operações que seriam múltiplas queries ou locks na aplicação tornam-se um único round-trip atômico no servidor. Modelar bem — escolher hash em vez de JSON gigante em string, sorted set em vez de lista ordenada na app — define eficiência de memória e latência.
Conteúdo
Strings — mais do que texto
Tipo mais básico; valores até 512 MB. Suporta operações atômicas numéricas e bitwise.
SET contador 0
INCR contador
INCRBY contador 10
GET contador
SET flag:feature-x "1" EX 86400 NX
SET NX EX é base de distributed lock leve. Strings também armazenam JSON serializado quando não há necessidade de campos parciais.
Hashes — objetos com campos
Ideal para entidades com atributos mutáveis (usuário, sessão, produto resumido):
HSET usuario:42 nome "Ana" email "ana@ex.com" plano "pro"
HGET usuario:42 email
HGETALL usuario:42
HINCRBY usuario:42 login_count 1
| String JSON única | Hash |
|---|---|
| Atualizar um campo reescreve tudo | HSET campo isolado |
| Mais bytes se campos pequenos | Encoding compacto (ziplist/listpack) |
Lists — filas FIFO/LIFO
Lista duplamente encadeada de strings. LPUSH/RPOP para fila; LRANGE para inspeção:
LPUSH fila:tarefas "enviar-email"
LPUSH fila:tarefas "gerar-relatorio"
BRPOP fila:tarefas 0
BRPOP bloqueia até haver elemento — worker eficiente sem polling agressivo. Listas não são ideais para ranking (use sorted set) nem para membership rápido (use set).
Sets — conjuntos únicos
Sem ordem; SADD, SISMEMBER, SINTER, SUNION:
SADD tags:post:100 redis cache performance
SISMEMBER tags:post:100 redis
SINTER tags:post:100 tags:post:200
Úteis para tags, deduplicação (SADD visitantes:2026-07-08 user-42 retorna 0 se já existia) e relações many-to-many leves.
Sorted sets (ZSET) — score ordenado
Cada membro tem score numérico; ordem por score em O(log N):
ZADD leaderboard 2850 "player_ana"
ZADD leaderboard 3100 "player_bruno"
ZREVRANK leaderboard "player_ana"
ZRANGEBYSCORE leaderboard 3000 +inf WITHSCORES
Casos: rankings, filas prioritárias, sliding window rate limit (scores = timestamps).
Streams — log append-only com consumer groups
Evolução para event sourcing leve e filas duráveis:
XADD pedidos * cliente_id 42 total 199.90
XREAD COUNT 10 STREAMS pedidos 0
XGROUP CREATE pedidos grupo-pagamento $ MKSTREAM
XREADGROUP GROUP grupo-pagamento worker-1 COUNT 1 STREAMS pedidos >
Streams mantêm histórico (até trimming), ACK por consumidor e reprocessamento de pending — superior a listas para pipelines críticos.
Tabela de decisão rápida
| Necessidade | Estrutura |
|---|---|
| Cache blob / contador | String |
| Objeto com campos | Hash |
| Fila simples | List |
| Tags / unicidade | Set |
| Ranking / prioridade | Sorted set |
| Event log / fila durável | Stream |
| Cardinalidade aproximada | HyperLogLog (PFADD) |
| Bitmap de presença | String com SETBIT/GETBIT |
Exemplos práticos
Modelar carrinho de compras:
HSET carrinho:sessao-abc produto:1 2 produto:7 1
HINCRBY carrinho:sessao-abc produto:1 1
HLEN carrinho:sessao-abc
EXPIRE carrinho:sessao-abc 7200
Rate limit com janela deslizante via sorted set:
ZADD rl:user:42 1710000000 "req-1" 1710000001 "req-2"
ZREMRANGEBYSCORE rl:user:42 0 1709999940
ZCARD rl:user:42
Inspecionar tipo e encoding interno:
OBJECT ENCODING usuario:42
TYPE usuario:42
Resumo
- Redis oferece strings, hashes, lists, sets, sorted sets, streams e tipos auxiliares (HLL, bitmap, geo).
- A escolha correta reduz memória, round-trips e bugs de concorrência na aplicação.
- Hashes para objetos; ZSET para ordem por score; Streams para filas duráveis com grupos.
- Comandos como
KEYS,SMEMBERSem sets enormes ouLRANGEem listas longas exigem cautela — prefiraSCAN, paginação e trimming. - Próximas aulas tratam persistência e replicação — estruturas só persistem se RDB/AOF estiverem configurados.