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
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.
7.x (apt padrão Ubuntu 24.04) 6379 (apenas loopback) 127.0.0.1 ::1 /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.
Atualize o índice de pacotes e instale o servidor:
sudo apt update
sudo apt install -y redis-serverO 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.
Verifique que o serviço está rodando:
sudo systemctl status redis-server
redis-cli pingO 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.
Configure o Redis pra iniciar com o sistema:
sudo systemctl enable redis-serverSem 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.
Edite o arquivo de configuração:
sudo nano /etc/redis/redis.confLocalize 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-lruA 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.
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.
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.
Reinicie pra aplicar as mudanças estruturais:
sudo systemctl restart redis-server
redis-cli -a SuaSenhaForteAleatoria32Chars pingA 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.
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.
Instale a extensão phpredis:
sudo apt install -y php-redis
sudo systemctl restart php8.3-fpmAjuste a versão do PHP-FPM conforme sua instalação. Após reiniciar, confirme com php -m | grep redis — deve listar redis.
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.
Instale o cliente no projeto Node:
npm install redisCrie 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.
Conecte ao Redis e inspecione estatísticas:
redis-cli -a SuaSenhaForteAleatoria32Chars
> INFO stats
> INFO memory
> DBSIZEMétricas importantes:
keyspace_hitsvskeyspace_misses: hit ratio ideal acima de 80% pra cache de objeto eficienteused_memory_human: memória em uso, deve estar abaixo domaxmemoryconfiguradoevicted_keys: se cresce rápido, aumentemaxmemoryou 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).
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/cacheno PHP oucache-managerno 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.