Redis com Docker na VPS: cache e filas

Redis é um banco de dados em memória usado para cache, filas de jobs, sessões e pub/sub. É uma dependência comum de apps self-hosted: n8n usa Redis para filas, Chatwoot para ActionCable e Sidekiq, apps Node.js com BullMQ. Configurar Redis para produção exige definir limit de memória e política de eviction, sem isso, o Redis pode consumir toda a RAM da VPS.

Instalar Redis com Docker Compose

A configuração mínima para Redis em produção inclui limite de memória, política de eviction e persistência:

yaml
services:
  redis:
    image: redis:7-alpine
    restart: always
    command: >
      redis-server
      --maxmemory 256mb
      --maxmemory-policy allkeys-lru
      --save 60 1000
      --appendonly yes
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 5
    deploy:
      resources:
        limits:
          memory: 320M

volumes:
  redis_data:

Políticas de eviction: qual escolher

A política de eviction define o que acontece quando o Redis atinge maxmemory. A escolha depende do uso:

bash
# allkeys-lru — CACHE GERAL
# Remove qualquer chave (com ou sem TTL) pela política LRU
# Use para: cache de objetos, cache de sessões sem TTL fixo
--maxmemory-policy allkeys-lru

# volatile-lru — CACHE COM EXPIRAÇÃO
# Remove apenas chaves com TTL configurado, pela política LRU
# Use para: cache onde algumas chaves são permanentes (não devem ser evicadas)
--maxmemory-policy volatile-lru

# noeviction — FILAS E DADOS CRÍTICOS
# Retorna erro ao tentar escrever quando memória está cheia
# Use para: Sidekiq jobs, BullMQ queues — nunca perder dados da fila
--maxmemory-policy noeviction

# allkeys-lfu — CACHE DE ALTA FREQUÊNCIA (Redis 4+)
# Remove chaves menos frequentemente usadas (LFU em vez de LRU)
# Melhor que LRU para caches com acesso skewed (80/20)
--maxmemory-policy allkeys-lfu

Persistência: RDB vs AOF

Redis tem dois mecanismos de persistência para sobreviver a reinicializações:

bash
# RDB — snapshot periódico (padrão)
# Salva snapshot completo em arquivo .rdb em intervalos configurados
# Vantagem: arquivo menor, restore mais rápido
# Desvantagem: pode perder dados desde o último snapshot
--save 900 1       # salvar se >= 1 chave mudou em 900 segundos
--save 300 10      # salvar se >= 10 chaves mudaram em 300 segundos
--save 60 1000     # salvar se >= 1000 chaves mudaram em 60 segundos

# AOF — append-only file
# Registra cada operação de escrita em um log
# Vantagem: perda mínima de dados (máximo 1 segundo)
# Desvantagem: arquivo maior, rebuild mais lento
--appendonly yes
--appendfsync everysec   # flush a cada segundo (melhor trade-off)

# RDB + AOF (recomendado para filas/dados críticos)
--save 60 1000
--appendonly yes

Monitoramento e diagnóstico

Comandos para monitorar o Redis em produção:

bash
# Informações gerais (memória, conexões, uptime)
docker compose exec redis redis-cli info server | grep -E "redis_version|uptime"
docker compose exec redis redis-cli info memory | grep -E "used_memory_human|maxmemory_human|mem_fragmentation"
docker compose exec redis redis-cli info stats | grep -E "total_commands|instantaneous_ops|evicted_keys"

# Ver chaves por padrão (cuidado em produção — pode travar)
docker compose exec redis redis-cli --scan --pattern "bull:*" | head -20

# Monitorar comandos em tempo real (diagnóstico)
docker compose exec redis redis-cli monitor

# Verificar filas BullMQ/Bull
docker compose exec redis redis-cli llen bull:nome-da-fila

# Flush de cache (apaga TODAS as chaves — cuidado!)
docker compose exec redis redis-cli flushdb   # apenas o banco atual
docker compose exec redis redis-cli flushall  # todos os bancos

Proteger o Redis com senha

Redis não requer autenticação por padrão. Em VPS compartilhada ou com porta exposta, configure uma senha:

bash
# Adicionar ao comando do Redis no docker-compose.yml
command: >
  redis-server
  --requirepass ${REDIS_PASSWORD}
  --maxmemory 256mb
  --maxmemory-policy allkeys-lru

# Conectar com autenticação
docker compose exec redis redis-cli -a ${REDIS_PASSWORD} ping

# Na URL de conexão da aplicação
REDIS_URL=redis://:sua_senha@redis:6379

# n8n: variável de ambiente
QUEUE_BULL_REDIS_PASSWORD=sua_senha

# Chatwoot: variável de ambiente
REDIS_URL=redis://:sua_senha@redis:6379/0

Não quer configurar manualmente?

Implante o Redis em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

Depende do modo. n8n sem Redis usa o modo padrão de execução: workflows rodam em processo único. Com Redis (modo queue), n8n distribui jobs entre múltiplos workers, necessário para alta concorrência (muitos workflows simultâneos). Para uso individual ou equipe pequena, n8n sem Redis é suficiente.

Valkey é o fork open-source comunitário do Redis após a mudança de licença do Redis em 2024. A API é 100% compatível com Redis 7. Para novos projetos, Valkey (docker pull valkey/valkey) é recomendado pela licença BSD e manutenção ativa da Linux Foundation. Apps existentes funcionam sem mudança de código, apenas troque a imagem.

Meça o uso real em produção: docker compose exec redis redis-cli info memory | grep used_memory_human. Para cache: aloque 20–30% a mais que o pico observado. Para filas: calcule o tamanho máximo esperado da fila × tamanho médio do job × fator de segurança 2x. Monitore evicted_keys, se > 0, aumente o maxmemory.

Tecnicamente sim, mas raramente recomendado para dados relacionais. Redis é excelente como banco principal para: contadores em tempo real, leaderboards, sessões, rate limiting, pub/sub. Não é adequado como substituto de PostgreSQL para dados relacionais complexos com queries SQL.

redis-cli --rdb dump.rdb no servidor de origem. Restaurar copiando dump.rdb para o volume da nova instância. Alternativamente: redis-cli --pipe no modo pipe. Para migração online (sem downtime), configure replicação temporária: SLAVEOF IP_NOVO porta no Redis antigo, espere sincronizar, remova a replicação.