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.