Redis além de cache: streams, pub/sub, scripts
- ⬜🍃 MongoDB em produção(NoSQL + Vector Databases)
Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.
Redis não é só cache
| Estrutura | Resolve | Armadilha |
|---|---|---|
| Texto com expiração | Cache clássico | Expiração igual para tudo gera renovação em massa |
| Conjunto ordenado | Ranking, fila por prioridade, janela deslizante | Cresce sem limite se ninguém podar |
| Contador atômico | Limite de taxa, contagem | Ler e escrever em passos separados abre corrida |
| Fluxo de eventos | Fila com grupos de consumo e confirmação | Sem podar, o fluxo consome memória indefinidamente |
| Hash | Objeto com campos atualizáveis em separado | Expiração é do hash inteiro, não por campo |
| Script atômico | Vários comandos como uma operação | Script lento bloqueia o servidor — ele é de thread única |
A maior parte dos times usa Redis como cache de string com TTL. É desperdiçar 80% da ferramenta. Redis é uma estrutura de dados remota: hashes, listas, sets, sorted sets, streams, bitmaps, HyperLogLog, geo. Cada um resolve um problema específico sem ter que mover dados para o app.
Leaderboard com SORTED SET
# ZADD adiciona/atualiza score em O(log N)
ZADD leaderboard:global 1500 "user:42"
ZADD leaderboard:global 2100 "user:17"
ZADD leaderboard:global 980 "user:99"
# Top 10 (descending)
ZREVRANGE leaderboard:global 0 9 WITHSCORES
# Posicao do usuario 42 (rank)
ZREVRANK leaderboard:global "user:42"
# Incrementar score atomicamente (ex: +50 XP)
ZINCRBY leaderboard:global 50 "user:42"
# Slice por score (scores entre 1000 e 2000)
ZRANGEBYSCORE leaderboard:global 1000 2000 WITHSCORESZSET é a estrutura mais poderosa do Redis. Leaderboards, delayed jobs, sliding window rate limit, priority queue, trending content — tudo vira ZSET com score bem escolhido.
Rate limiter atômico com Lua
Implementação de sliding window rate limit em um único EVAL. Atomicidade garantida, zero race condition.
-- KEYS[1] = chave da janela (ex: "rl:user:42")
-- ARGV[1] = now em ms
-- ARGV[2] = janela em ms
-- ARGV[3] = limite
-- ARGV[4] = request id unico
local key = KEYS[1]
local now = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
local limit = tonumber(ARGV[3])
local reqId = ARGV[4]
-- 1) Remove requests fora da janela
redis.call('ZREMRANGEBYSCORE', key, '-inf', now - window)
-- 2) Conta requests dentro da janela
local count = redis.call('ZCARD', key)
if count < limit then
redis.call('ZADD', key, now, reqId)
redis.call('PEXPIRE', key, window)
return { 1, limit - count - 1 } -- ok, restantes
else
return { 0, 0 } -- bloqueado
end// Uso no Node (ioredis)
const script = await fs.readFile('rate_limit.lua', 'utf8');
const sha = await redis.script('LOAD', script);
async function allow(userId: string) {
const now = Date.now();
const result = await redis.evalsha(
sha, 1,
'rl:user:' + userId,
now, 60000, 100, crypto.randomUUID()
) as [number, number];
return { allowed: result[0] === 1, remaining: result[1] };
}Por que operações compostas devem ser feitas com script no servidor, e não em idas e voltas?
Streams: log persistente tipo Kafka-lite
# Producer
XADD events * type signup userId 42
XADD events * type purchase userId 42 amount 99.90
# Consumer group (processamento exactly-once-ish)
XGROUP CREATE events analytics $ MKSTREAM
XREADGROUP GROUP analytics worker-1 COUNT 10 BLOCK 5000 STREAMS events >
# Ack apos processar
XACK events analytics 1738000000000-0Streams substitui filas pub/sub simples quando você precisa de replay, consumer groups e retention. Não substitui Kafka em escala massiva (GB/s).
Persistence real: AOF vs RDB
RDB é snapshot periódico — rápido no restart, mas perde os writes entre snapshots. AOF (append-only file) loga cada write com fsync configurável — durability real. Em produção séria: AOF com appendfsync everysec + RDB semanal para backup. Nunca rodar Redis sem persistence se o dado importa.
Redis bem usado substitui 3-4 serviços: cache, fila, rate limiter, pub/sub, session store, leaderboard. Dominar estruturas vale mais que saber 10 bancos.
Perguntas frequentes
❓ O que dá para fazer no Redis além de cache?
❓ Redis é seguro como fonte de verdade?
❓ Como implementar trava distribuída sem errar?
Fixando
Qual estrutura resolve naturalmente um placar ordenado com posição consultável?
Qual cuidado é essencial ao usar esse tipo de banco como mais que cache?
Terminou de ler?
Marcar como concluído registra o XP, mantém sua sequência e coloca 3 cartas deste módulo na fila de revisão espaçada.
Próximos passos sugeridos
Temas deste módulo
Discussão
Carregando comentários…