kb.erickguedes.com
Redis: Cache, Fila e Tempo Real

Fundamentos do Redis

Aula 1 de 6

Instalação

Docker

# Redis Stack (inclui módulos: RedisJSON, RediSearch, RedisTimeSeries, RedisBloom)
docker run -d \
    --name redis-stack \
    -p 6379:6379 \
    -p 8001:8001 \
    -v redis-data:/data \
    redis/redis-stack:latest

# Redis standalone
docker run -d \
    --name redis \
    -p 6379:6379 \
    -v redis-data:/data \
    redis:7-alpine

apt (Debian/Ubuntu)

# Instalar Redis
sudo apt update
sudo apt install redis-server -y

# Verificar versão
redis-server --version
redis-cli --version

# Iniciar serviço
sudo systemctl start redis-server
sudo systemctl enable redis-server

# Configuração
sudo nano /etc/redis/redis.conf
sudo systemctl restart redis-server

redis-cli

# Conectar
redis-cli
redis-cli -h 192.168.1.10 -p 6379 -a senha123
redis-cli --tls -h redis.exemplo.com

# Comandos básicos
SET chave "valor"
GET chave
DEL chave
EXISTS chave
KEYS *                  # CUIDADO em produção (bloqueante)
SCAN 0 MATCH user:*     # Não bloqueante
FLUSHALL                # LIMPA TUDO
FLUSHDB                 # Limpa DB atual
TYPE chave
RANDOMKEY
DBSIZE

# Trabalhar com múltiplos databases
SELECT 0                # database 0 (padrão)
SELECT 1                # database 1
MOVE chave 1            # mover chave para DB 1
SWAPDB 0 1              # trocar databases atomicamente

Configuração (redis.conf)

# redis.conf — principais diretivas
bind 127.0.0.1                  # escutar apenas localhost
bind 0.0.0.0                    # todas as interfaces
port 6379                       # porta padrão
tls-port 6380                   # porta SSL/TLS
daemonize yes                   # rodar como daemon
requirepass sua_senha_aqui     # senha de acesso

# Limites
maxclients 10000                # máximo conexões
timeout 300                     # desconectar idle em segundos

# logging
loglevel notice                 # debug, verbose, notice, warning
logfile /var/log/redis/redis.log

# Persistência
save 900 1                      # snapshot a cada 15min se 1 chave mudou
save 300 10                     # snapshot a cada 5min se 10 chaves
save 60 10000                   # snapshot a cada 1min se 10000 chaves
appendonly yes                  # AOF habilitado
appendfsync everysec            # fsync a cada segundo

Data Types

String

SET nome "Maria"
GET nome                    # "Maria"
SET contador 0
INCR contador               # 1
INCRBY contador 5           # 6
DECR contador               # 5
GETSET nome "João"          # "Maria" (retorna antigo)
MSET a 1 b 2 c 3            # multi set
MGET a b c                  # multi get (1, 2, 3)
STRLEN nome                 # tamanho
APPEND nome " Silva"        # "João Silva"
GETRANGE nome 0 3           # "João"

List

LPUSH fila "tarefa1"        # adiciona à esquerda
RPUSH fila "tarefa2"        # adiciona à direita
LPOP fila                   # remove e retorna esquerda
RPOP fila                   # remove e retorna direito
LLEN fila                   # tamanho
LRANGE fila 0 -1            # todos os elementos
LINDEX fila 0               # primeiro elemento
LTRIM fila 0 10             # manter apenas 0-10
BLPOP fila 0                # blocking LPOP (0 = infinito)
BRPOP fila 5                # blocking RPOP (timeout 5s)

Set

SADD users:online "user:1" "user:2" "user:3"
SMEMBERS users:online       # todos membros
SISMEMBER users:online "user:1"  # 1 (true)
SCARD users:online          # cardinalidade (3)
SREM users:online "user:2"  # remover
SPOP users:online           # pop aleatório
SRANDMEMBER users:online 2  # 2 aleatórios

# Operações entre sets
SADD set1 a b c d
SADD set2 c d e f
SINTER set1 set2            # interseção: c, d
SUNION set1 set2            # união: a, b, c, d, e, f
SDIFF set1 set2             # diferença: a, b

Sorted Set

ZADD ranking 100 "joao" 85 "maria" 200 "pedro"
ZRANGE ranking 0 -1                    # por score crescente
ZRANGE ranking 0 -1 REV                # decrescente
ZRANK ranking "maria"                  # posição (0-based)
ZSCORE ranking "joao"                  # score
ZINCRBY ranking 50 "joao"              # incrementar score
ZREVRANGE ranking 0 9 WITHSCORES       # top 10
ZRANK ranking "joao" WITHSCORE
ZREMRANGEBYSCORE ranking 0 50          # remover por score
ZCOUNT ranking 0 100                   # count entre scores

Hash

HSET user:1001 nome "Maria" idade 30 cidade "SP"
HGET user:1001 nome           # "Maria"
HGETALL user:1001             # todas as chaves:valores
HKEYS user:1001               # apenas chaves
HVALS user:1001               # apenas valores
HLEN user:1001                # número de campos
HEXISTS user:1001 email       # 0 (não existe)
HSETNX user:1001 email "[email protected]"  # set se não existe
HDEL user:1001 idade          # deletar campo
HINCRBY user:1001 pontos 10   # incrementar campo numérico
HMSET user:1002 nome "João" idade 25  # multi set

Stream

XADD events * type login user "maria"
XADD events * type logout user "joao"
XLEN events
XRANGE events - +                     # todos eventos
XRANGE events - + COUNT 10            # primeiros 10
XREAD COUNT 2 STREAMS events 0        # ler do início
XREAD BLOCK 0 STREAMS events $        # aguardar novos (blocking)
XDEL events 1717000000000-0           # deletar entrada
XTRIM events MAXLEN ~ 1000            # manter ~1000 entradas

Bitmap, HyperLogLog, GeoSpatial

# Bitmap: acesso a bits individuais
SETBIT acesso:2024-01-15 1234 1       # usuário 1234 acessou
GETBIT acesso:2024-01-15 1234         # 1
BITCOUNT acesso:2024-01-15            # total de acessos únicos

# HyperLogLog: contagem aproximada (erro ~0.81%)
PFADD visitas:hoje "ip1" "ip2" "ip1"
PFCOUNT visitas:hoje                  # 2 (aproximado)
PFMERGE total visitas:hoje visitas:ontem

# GeoSpatial: coordenadas
GEOADD pontos -23.5505 -46.6333 "SP"
GEOADD pontos -22.9068 -43.1729 "RJ"
GEODIST pontos SP RJ km              # distância SP-RJ
GEORADIUS pontos -23.5 -46.6 50 km   # pontos num raio de 50km

Key Expiration

# Expirar chaves
SET token "abc123" EX 3600           # expira em 1 hora
SETEX token 3600 "abc123"            # mesmo que SET ... EX
PSETEX token 3600000 "abc123"        # em milissegundos

# Gerenciar TTL
EXPIRE token 3600                    # setar TTL
EXPIREAT token 1717000000            # expirar em timestamp
TTL token                            # tempo restante (s)
PTTL token                           # tempo restante (ms)
PERSIST token                        # remover expiração

# SET com NX/XX
SET lock "1" NX EX 10                # set apenas se não existe (NX) + TTL
SET lock "1" XX EX 10                # set apenas se existe (XX)

info memory

# Informações de memória
redis-cli INFO memory

# Campos importantes
# used_memory_human: 1.5M
# used_memory_rss_human: 3.2M
# used_memory_peak_human: 5.0M
# maxmemory_human: 0
# mem_fragmentation_ratio: 2.13
# total_system_memory_human: 16.00G

# Monitorar tamanhos
DEBUG OBJECT chave                    # detalhes internos
MEMORY USAGE chave                    # bytes usados
MEMORY STATS                          # estatísticas detalhadas
MEMORY PURGE                          # liberar memória

Lab: Cache de Perfil de Usuário

cat > profile-cache.sh << 'SCRIPT'
#!/bin/bash
set -euo pipefail

echo "=== REDIS FUNDAMENTOS: CACHE DE PERFIL ==="

# Popular dados do usuário
redis-cli << 'REDIS'
-- Usar hash para perfil
HMSET user:profile:1001 \
    nome "Maria Silva" \
    email "[email protected]" \
    idade 30 \
    cidade "São Paulo" \
    plano "premium" \
    criado_em "2024-01-15"

-- Expirar em 1 hora
EXPIRE user:profile:1001 3600

-- Sessão ativa
SET session:abc123 "user:1001" EX 1800

-- Adicionar ao set de usuários online
SADD users:online user:1001
EXPIRE users:online 300

-- Log de acesso via stream
XADD access:log * \
    user_id 1001 \
    action login \
    ip "192.168.1.100"

-- Contador de visitas
INCR stats:visits:total
INCR stats:visits:2024-01-15
REDIS

# Ler dados
echo ""
echo "=== DADOS DO USUÁRIO ==="
redis-cli HGETALL user:profile:1001

echo ""
echo "=== USUÁRIOS ONLINE ==="
redis-cli SMEMBERS users:online

echo ""
echo "=== ESTATÍSTICAS ==="
redis-cli GET stats:visits:total
redis-cli GET stats:visits:2024-01-15

echo ""
echo "=== INFO MEMORY ==="
redis-cli INFO memory | grep -E "used_memory_human|maxmemory_human|mem_fragmentation_ratio"

echo ""
echo "=== TTL restante ==="
redis-cli TTL user:profile:1001
SCRIPT

chmod +x profile-cache.sh

Redis é um servidor de estruturas de dados em memória. Cada tipo (String, List, Set, Sorted Set, Hash, Stream, Bitmap, HyperLogLog, GeoSpatial) tem comandos específicos. TTL é essencial para evitar acúmulo de dados. INFO memory monitora saúde.