Redis na VPS Ubuntu

    Redis é a solução padrão para cache, filas de tarefas, pub/sub e sessões em memória — completamente diferente do PostgreSQL em propósito. Com latência de sub-milissegundo e estruturas de dados ricas (strings, hashes, lists, sets, sorted sets), Redis resolve problemas que bancos relacionais resolvem de forma ineficiente.

    Instalar Redis pelo repositório oficial

    Use o repositório oficial para ter sempre a versão mais recente:

    bash
    # Adicionar repositório oficial do Redis
    curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
    echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
    
    sudo apt update
    sudo apt install -y redis
    
    # Verificar instalação
    redis-server --version
    sudo systemctl status redis
    
    # Habilitar início automático
    sudo systemctl enable redis
    
    # Testar com redis-cli
    redis-cli ping
    # PONG

    Configurar segurança e autenticação

    Proteja o Redis com senha e restrição de bind:

    bash
    # /etc/redis/redis.conf
    
    # Bind apenas para localhost (ou IP interno)
    bind 127.0.0.1 -::1
    
    # Porta padrão
    port 6379
    
    # Autenticação com senha forte
    requirepass senha_redis_muito_forte_aqui
    
    # Renomear comandos perigosos (opcional mas recomendado):
    rename-command FLUSHALL ""          # desabilitar flush total
    rename-command FLUSHDB ""           # desabilitar flush do banco
    rename-command DEBUG ""             # desabilitar debug
    rename-command CONFIG "CONFIG_SECRETO_XYZ"   # renomear config
    
    # Limite de memória
    maxmemory 512mb
    maxmemory-policy allkeys-lru        # despejar chaves menos usadas
    
    # Reiniciar
    sudo systemctl restart redis
    
    # Testar autenticação:
    redis-cli -a "senha_redis_muito_forte_aqui" ping
    # Ou:
    redis-cli
    AUTH senha_redis_muito_forte_aqui
    PING
    Atenção
    Redis com bind 0.0.0.0 sem senha e exposto à internet é uma das vulnerabilidades mais exploradas — permite leitura/escrita de qualquer dado e execução de comandos. Sempre use bind 127.0.0.1 e requirepass.

    Configurar persistência

    Redis tem dois mecanismos de persistência com tradeoffs diferentes:

    bash
    # /etc/redis/redis.conf — configurar persistência
    
    # === RDB (Snapshot) — padrão ===
    # Salva snapshot a cada N segundos se X chaves mudaram
    save 3600 1     # 1 mudança em 1h
    save 300 100    # 100 mudanças em 5min
    save 60 10000   # 10000 mudanças em 1min
    
    dbfilename dump.rdb
    dir /var/lib/redis
    
    # === AOF (Append Only File) — mais durável ===
    appendonly yes
    appendfilename "appendonly.aof"
    appendfsync everysec    # fsync a cada segundo (balanço boa durabilidade/perf)
    # appendfsync always    # fsync em cada escrita (máxima durabilidade, mais lento)
    # appendfsync no        # deixa o OS decidir (mais rápido, menos durável)
    
    # Recomendação para cache puro (sem necessidade de persistência):
    # save ""              # desabilitar RDB
    # appendonly no        # desabilitar AOF
    # (Redis mais rápido e sem overhead de IO)
    
    # Verificar estado da persistência:
    redis-cli -a SENHA INFO persistence

    Casos de uso com exemplos de código

    Os principais padrões de uso do Redis com Node.js e Python:

    typescript
    # Node.js com ioredis:
    import Redis from 'ioredis'
    const redis = new Redis({
      host: '127.0.0.1', port: 6379,
      password: process.env.REDIS_PASSWORD,
      maxRetriesPerRequest: 3,
    })
    
    // Cache com TTL:
    await redis.setex('usuario:123', 300, JSON.stringify(userData))
    const cached = await redis.get('usuario:123')
    
    // Contador de rate limiting:
    const key = `rate:${ip}:${Math.floor(Date.now()/60000)}`
    const count = await redis.incr(key)
    await redis.expire(key, 60)
    if (count > 100) throw new Error('Rate limit exceeded')
    
    // Fila simples:
    await redis.rpush('tarefas', JSON.stringify(task))
    const task = await redis.blpop('tarefas', 0)  // bloqueante
    
    # Python com redis-py:
    import redis
    r = redis.Redis(host='localhost', port=6379,
                    password='senha', decode_responses=True)
    
    # Cache:
    r.setex('chave', 300, 'valor')
    valor = r.get('chave')
    
    # Pub/Sub:
    p = r.pubsub()
    p.subscribe('canal')
    for msg in p.listen():
        print(msg)

    Monitorar o Redis em produção

    Comandos essenciais para acompanhar o estado do Redis:

    bash
    # Visão geral completa do servidor:
    redis-cli -a SENHA INFO all | grep -E "used_memory_human|connected_clients|total_commands|keyspace_hits|keyspace_misses|evicted_keys|rdb_last_save|aof_enabled"
    
    # Monitorar comandos em tempo real (CUIDADO: muito verboso):
    redis-cli -a SENHA MONITOR | head -100
    
    # Latência:
    redis-cli -a SENHA --latency-history -i 1
    
    # Identificar chaves grandes:
    redis-cli -a SENHA --bigkeys
    
    # Verificar taxa de hit do cache:
    redis-cli -a SENHA INFO stats | grep keyspace
    # keyspace_hits: cache hits
    # keyspace_misses: cache misses
    # Hit ratio = hits / (hits + misses)
    
    # Listar bancos e número de chaves:
    redis-cli -a SENHA INFO keyspace
    
    # Verificar uso de memória por tipo de dado:
    redis-cli -a SENHA MEMORY DOCTOR

    $ runstack deploy --plan starter

    Não quer configurar manualmente?

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

    Perguntas frequentes