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

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

Não quer configurar manualmente?

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

Perguntas frequentes

Redis: tipos de dados ricos, persistência opcional, pub/sub, Lua scripting, clustering nativo, TTL por chave. Memcached: apenas strings, sem persistência, mais simples. Em 2025: escolha Redis, é mais versátil e a diferença de performance pura é irrelevante para a maioria dos casos. Memcached só faz sentido se você precisar de cache multithreaded com chaves muito grandes.

allkeys-lru: remove chaves menos recentemente usadas, boa para cache genérico. volatile-lru: remove apenas chaves com TTL definido, por LRU. allkeys-lfu: remove chaves menos frequentemente usadas (melhor que LRU para padrões irregulares). noeviction: retorna erro quando memória cheia, use quando o Redis não é puramente cache.

Sentinel: monitoramento e failover automático para setup master/replica único, sem sharding, dados replicados inteiros. Cluster: sharding horizontal com dados particionados entre múltiplos nós, escala além de um único servidor. Para uma VPS: Redis standalone com maxmemory atende 99% dos casos. Sentinel/Cluster para workloads que exigem alta disponibilidade ou terabytes de dados.

Com configuração padrão (RDB ativado): perde dados desde o último snapshot, geralmente segundos a minutos. Com AOF (appendonly yes) e appendfsync everysec: perde no máximo 1 segundo de dados. Com appendfsync always: zero perda de dados, mas mais lento. Para cache puro: perda total não é problema, os dados são regenerados do banco principal.

Redis tem 16 bancos lógicos (0-15) por padrão, acessíveis com SELECT N. No entanto, o uso de múltiplos bancos é desencorajado em produção: não têm isolamento real, não funcionam com Redis Cluster e confundem a gestão. Melhor: usar prefixo de chaves (cache:, session:, queue:) em um único banco ou múltiplas instâncias Redis.