databases/Artigo

    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:
    Dica
    maxmemory-policy allkeys-lru remove as chaves menos recentemente usadas quando o limite é atingido — adequado para cache. Para filas (onde perder dados é inaceitável), use noeviction e monitore o uso de memória.

    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
    Dica
    Para apps que usam Redis como tanto cache quanto fila (ex: n8n), considere instâncias separadas com políticas diferentes — uma com allkeys-lru para cache e outra com noeviction para filas.

    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
    Dica
    Para uso exclusivo como cache (dados que podem ser perdidos): desative persistência completamente com --save "" --no-appendfsync-on-rewrite yes. Redis sem persistência é 20–30% mais rápido.

    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
    Atenção
    redis-cli monitor e redis-cli keys * impactam a performance em produção — use apenas para diagnóstico pontual. --scan é a alternativa segura ao keys * para listar chaves.

    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
    Dica
    Redis rodando apenas dentro da rede Docker interna (sem porta mapeada no host) tem risco mínimo mesmo sem senha — outros containers só acessam se estiverem na mesma rede. A senha é mais importante quando a porta está exposta no host.

    $ runstack deploy --plan starter

    Não quer configurar manualmente?

    Não quer configurar manualmente? Implante o Redis em menos de 3 minutos com a Runstack. Infraestrutura da OPEN DATACENTER, com servidores no Brasil.

    Perguntas frequentes