Como configurar Redis como cache de objeto em VPS Linux

Guia técnico para instalar Redis numa VPS Ubuntu, configurar autenticação, persistência e integrar com aplicações PHP ou Node.js como cache de objeto.

Cache de objeto em memória é uma das otimizações com melhor custo-benefício pra qualquer aplicação web que faz queries repetidas, renderiza fragmentos custosos ou serializa sessões. Redis virou o padrão de fato — single-threaded, latência sub-milissegundo, suporte nativo em quase todo framework PHP, Node.js, Python ou Ruby.

Este tutorial mostra como instalar Redis 7.x numa VPS Ubuntu 24.04 LTS, aplicar hardening básico (autenticação, bind local, limites de memória) e integrar com aplicações PHP e Node.js. O foco é uso como cache de objeto — não como banco persistente nem como broker de fila, embora a configuração base sirva como ponto de partida.

Tempo estimado de execução: 20 a 30 minutos, incluindo testes. Você sai com Redis rodando, autenticado, com política de descarte configurada e exemplo de integração funcional.

Pré-requisitos

Pré-requisitos técnicos

VPS com Ubuntu 24.04 LTS, acesso SSH como usuário com sudo, ~512 MB de RAM livre (o Redis em si consome pouco; o limite vai depender do volume de cache). Aplicação PHP 8.x ou Node.js 20.x rodando no mesmo servidor. Firewall UFW ativo é recomendado.

Versão Redis 7.x (apt padrão Ubuntu 24.04)
Porta padrão 6379 (apenas loopback)
Bind recomendado 127.0.0.1 ::1
Arquivo de config /etc/redis/redis.conf

Se você nunca trabalhou com Redis antes, vale conhecer os tipos primários: strings, hashes, listas, sets e sorted sets. Pra cache de objeto, 90% do uso é string (valor serializado em JSON ou formato nativo do cliente). O resto aparece em casos específicos como leaderboards, filas leves e contadores.

Instalação do Redis

Esta seção cobre a instalação via repositório oficial do Ubuntu. A versão empacotada (7.x) atende cache de objeto sem ressalvas — você só precisa do repositório upstream se quiser features de versão muito recente como Redis Functions ou módulos específicos.

01

Atualize o índice de pacotes e instale o servidor:

sudo apt update
sudo apt install -y redis-server

O pacote redis-server instala o binário, o arquivo de configuração em /etc/redis/redis.conf e o service systemd. O serviço é iniciado automaticamente após a instalação.

02

Verifique que o serviço está rodando:

sudo systemctl status redis-server
redis-cli ping

O comando ping deve retornar PONG. Se retornar erro de conexão, cheque os logs com sudo journalctl -u redis-server -n 50 — normalmente é permissão de arquivo ou conflito de porta.

03

Configure o Redis pra iniciar com o sistema:

sudo systemctl enable redis-server

Sem isso, após um reboot da VPS o Redis fica parado e sua aplicação quebra silenciosamente — não esqueça desse passo em ambientes que reiniciam por updates de kernel.

Configuração de segurança e limites

O Redis instalado direto do apt vem com defaults razoáveis pra desenvolvimento mas inseguros pra produção: sem senha, persistência ligada, sem limite de memória. Vamos ajustar isso.

04

Edite o arquivo de configuração:

sudo nano /etc/redis/redis.conf

Localize e ajuste estas diretivas (use Ctrl+W no nano pra buscar):

bind 127.0.0.1 ::1
protected-mode yes
port 6379
requirepass SuaSenhaForteAleatoria32Chars
maxmemory 256mb
maxmemory-policy allkeys-lru

A diretiva bind garante que o Redis só escuta na interface loopback — ninguém da internet alcança a porta 6379. protected-mode yes é uma segunda camada que recusa conexões externas mesmo se o bind for relaxado por engano. requirepass exige autenticação em toda conexão.

Gerar senha aleatória correta

Nunca use senha curta ou palavra de dicionário no requirepass. Redis processa mais de 80 mil tentativas por segundo, e um atacante com acesso local (via container vizinho comprometido ou app vulnerável) quebra senha fraca em segundos. Gere com openssl rand -base64 32.

05

Desabilite a persistência se for usar só como cache:

Procure a seção SNAPSHOTTING no redis.conf e comente as três linhas save:

# save 3600 1 300 100 60 10000
save ""

Isso elimina o I/O periódico do snapshot RDB, reduzindo latência e desgaste do disco. Se a aplicação reconstrói o cache a partir do banco em poucos segundos, persistência é overhead sem benefício.

06

Reinicie pra aplicar as mudanças estruturais:

sudo systemctl restart redis-server
redis-cli -a SuaSenhaForteAleatoria32Chars ping

A resposta PONG confirma que a autenticação está funcional. Se aparecer NOAUTH Authentication required, a senha está sendo lida do config. Se aparecer WRONGPASS, você digitou errado.

Senha em linha de comando vaza no histórico

Usar -a SENHA na linha do redis-cli grava a senha no histórico do shell e no ps. Em scripts ou uso recorrente, prefira redis-cli interativo e rode AUTH senha dentro, ou exporte em variável de ambiente protegida com permissão 600.

Integração com PHP

PHP usa a extensão phpredis (nativa em C, mais performática) ou a biblioteca predis/predis via Composer (pure PHP, mais portável). Pra cache de objeto em produção, phpredis ganha por margem expressiva.

07

Instale a extensão phpredis:

sudo apt install -y php-redis
sudo systemctl restart php8.3-fpm

Ajuste a versão do PHP-FPM conforme sua instalação. Após reiniciar, confirme com php -m | grep redis — deve listar redis.

08

Crie um script de teste em /tmp/redis-test.php:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('SuaSenhaForteAleatoria32Chars');

$key = 'user:42:profile';
$cached = $redis->get($key);

if ($cached === false) {
    $data = ['id' => 42, 'name' => 'Joao', 'plan' => 'pro'];
    $redis->setex($key, 3600, json_encode($data));
    echo "Cache MISS — populated\n";
} else {
    echo "Cache HIT: " . $cached . "\n";
}

Rode duas vezes: a primeira chamada mostra MISS, a segunda HIT. O método setex define a chave com TTL de 3600 segundos — depois desse tempo, a chave expira automaticamente.

Integração com Node.js

Em Node.js o cliente recomendado é o oficial redis (v4+) — assíncrono, mantido pelo Redis Inc., compatível com TypeScript. Aplicações antigas com ioredis continuam suportadas, mas pra projeto novo use o oficial.

09

Instale o cliente no projeto Node:

npm install redis

Crie um arquivo cache.js com o setup base:

import { createClient } from 'redis';

const client = createClient({
  url: 'redis://:[email protected]:6379'
});

client.on('error', (err) => console.error('Redis error:', err));
await client.connect();

const key = 'session:abc123';
const cached = await client.get(key);

if (!cached) {
  await client.setEx(key, 1800, JSON.stringify({ userId: 42 }));
  console.log('MISS — populated');
} else {
  console.log('HIT:', cached);
}

A URL embute usuário vazio e a senha — formato padrão. Em produção, leia de variável de ambiente, nunca hardcode no código que vai pro repositório.

Verificação e monitoramento

Após configurar e integrar, vale validar que o cache está sendo usado de fato — métricas internas do Redis ajudam a detectar hit ratio baixo ou pressão de memória.

10

Conecte ao Redis e inspecione estatísticas:

redis-cli -a SuaSenhaForteAleatoria32Chars
> INFO stats
> INFO memory
> DBSIZE

Métricas importantes:

  • keyspace_hits vs keyspace_misses: hit ratio ideal acima de 80% pra cache de objeto eficiente
  • used_memory_human: memória em uso, deve estar abaixo do maxmemory configurado
  • evicted_keys: se cresce rápido, aumente maxmemory ou revise TTLs

Se hit ratio fica abaixo de 50% consistentemente, ou as chaves não estão sendo reutilizadas (TTL muito curto), ou a aplicação está cacheando dados únicos demais (chaves com parâmetros muito variáveis).

Monitor contínuo com redis-cli --stat

redis-cli -a SENHA --stat mostra throughput em tempo real (ops/s, memória, clientes conectados) — útil pra observar comportamento sob carga sem instalar nada extra. Pra dashboards persistentes, integre com seu sistema de métricas habitual.

Resolução de problemas

Erro “MISCONF Redis is configured to save RDB snapshots”

Aparece quando a persistência RDB está ligada mas o disco está cheio ou sem permissão de escrita. Se você desativou persistência no Passo 05, isso não deve acontecer — confirme que o save "" foi salvo e o serviço reiniciado. Em caso emergencial, CONFIG SET stop-writes-on-bgsave-error no permite escritas continuarem enquanto você resolve o disco.

Conexão recusada de aplicação em outro container Docker

Por padrão configuramos bind 127.0.0.1 — isso bloqueia conexões vindas de outros containers. Soluções: usar host network no container da aplicação, ou rodar o Redis também em container compartilhando network, ou expandir o bind pra incluir a interface do bridge (bind 127.0.0.1 172.17.0.1) com firewall fechando porta na interface externa.

Latência alta intermitente

Geralmente é I/O do snapshot RDB durante bgsave. Verifique com INFO persistence se rdb_last_bgsave_status está OK e quanto tempo levou. Se persistência é necessária mas snapshot causa picos, considere AOF com appendfsync everysec que tem perfil de I/O mais constante.

Próximos passos

Com Redis funcionando como cache de objeto, vale explorar:

  • Estratégias de cache em camadas (memória local + Redis + banco) com bibliotecas como symfony/cache no PHP ou cache-manager no Node
  • Pub/sub do Redis pra invalidação de cache entre múltiplos servidores de aplicação
  • Replicação master-replica pra leitura escalável quando uma instância não dá conta
  • Rate limiting com INCR + TTL — substitui implementações caseiras com performance superior

Se você está rodando isso em produção e precisa de instância dedicada com snapshots automáticos da VPS, latência consistente e proteção DDoS na borda, as VPS Hostini entregam isso por padrão — disco NVMe, rede com filtragem de pacotes e backup diário sem custo extra.

Perguntas frequentes

Qual a diferença entre Redis como cache e como banco de dados?

Redis pode servir aos dois papéis. Como cache, você define maxmemory + maxmemory-policy (allkeys-lru) pra ele descartar chaves antigas automaticamente. Como banco, você habilita persistência (RDB+AOF) e desativa eviction. Misturar os dois numa mesma instância gera comportamento imprevisível — separe por porta ou container.

Preciso configurar persistência se for usar só como cache?

Não necessariamente. Cache puro pode rodar com persistência desligada (save "" no redis.conf) — se reiniciar, o cache é reconstruído a partir do banco. Persistência só faz sentido se a reconstrução for cara (relatórios pesados, agregações). RDB snapshot tem custo de I/O periódico que pode impactar latência em VPS pequena.

Redis num único processo aguenta quanto throughput?

Uma instância Redis single-threaded numa VPS moderna processa 80-150k ops/s em operações simples (GET/SET) com latência sub-milissegundo. O gargalo costuma ser rede ou serialização da aplicação, não o Redis. Pra ultrapassar isso, use Redis Cluster ou réplicas read-only.

Como evito que o Redis fique exposto na internet por engano?

Mantenha bind 127.0.0.1 ::1 no redis.conf, mantenha protected-mode yes, e nunca abra a porta 6379 no firewall. Aplicações no mesmo host conectam via loopback. Se precisar de acesso remoto, use SSH tunnel ou stunnel — nunca exponha 6379 direto com password só.

Qual maxmemory-policy escolher para cache de objeto?

Pra cache puro, allkeys-lru é o padrão racional — descarta as chaves menos acessadas quando atinge o limite. allkeys-lfu (Least Frequently Used) funciona melhor quando o padrão de acesso é estável. Evite noeviction em cache: quando enche, escritas começam a falhar e a aplicação quebra.

Preciso reiniciar o Redis depois de mudar redis.conf?

Pra mudanças simples (maxmemory, timeout, requirepass), use CONFIG SET via redis-cli — aplica sem reiniciar. CONFIG REWRITE persiste no arquivo. Mudanças estruturais (bind, port, daemonize, persistência) exigem systemctl restart redis-server.

Tópicos:
Próximos passos Cloud Ryzen com NVMe e proteção DDoS sempre ativa.Coloque em produção numa VPS Hostini →
Esse tutorial foi útil?
Falar no WhatsApp