Redis como cache ou como banco: diferenças e persistência

Como cache, o Redis guarda cópias descartáveis de dados que existem em outro lugar e pode perdê-las. Como banco, ele é a fonte da verdade e precisa de persistência (RDB, AOF ou os dois).

Atualizado em 6 min de leitura

Objetivos de aprendizado

Depois de ler este artigo, você vai conseguir:

  • Entender o que muda entre usar o Redis como cache e como banco
  • Configurar expiração, limite de memória e política de remoção para cache
  • Escolher entre RDB e AOF para dados que não podem se perder
Nesta página

O Redis guarda os dados na RAM, e é isso que o deixa tão rápido. A mesma característica gera a dúvida mais comum sobre ele: se a memória some quando o processo para, dá para confiar nele para guardar dados de verdade?

Depende do papel que ele cumpre na sua aplicação. Como cache, perder os dados é aceitável. Como banco, não é, e aí você precisa configurar a persistência em disco. Para a visão geral da ferramenta, veja o que é Redis.

Como cachefonte da verdade: outro bancoRedis (RAM)cópias com TTLRedis (RAM)vazioBancoprincipalmiss: lê e grava com TTLbusca de novoComo bancofonte da verdade: o RedisRedis (RAM)dado originalRedis (RAM)restauradoDiscoRDB / AOFescritas vão ao discorecarrega ao iniciarrestart
Num restart, o cache volta vazio e se refaz a partir da origem; como banco, o Redis recarrega os dados do disco (RDB/AOF).

Qual é a diferença entre usar o Redis como cache e como banco?#

A pergunta que separa os dois usos é: se esse dado sumir, eu consigo recriá-lo?

  • Cache: o dado é uma cópia de algo que já existe em outro banco ou pode ser recalculado. Se sumir, a aplicação busca de novo na origem. O Redis só acelera.
  • Banco: o dado só existe no Redis (sessões, filas, contadores, rankings). Se sumir, ele se perde de vez.
Cache Banco
Fonte da verdade Outro banco O próprio Redis
Perder dados no restart Aceitável Não aceitável
Persistência em disco Pode ficar desligada RDB, AOF ou os dois
Expiração (TTL) Quase sempre Só em parte das chaves
Quando a memória enche Remover chaves antigas Recusar escritas e avisar
Dimensionamento Só o conjunto "quente" Todo o conjunto de dados

Como usar o Redis como cache?#

O padrão mais comum é o cache-aside: a aplicação consulta o cache primeiro e, só quando não encontra o dado (miss), vai ao banco e guarda o resultado com prazo de validade.

js
// npm install ioredis pg
import { Redis } from "ioredis";
import pg from "pg";

const redis = new Redis(process.env.REDIS_URL);
const pool = new pg.Pool({ connectionString: process.env.DATABASE_URL });

export async function getUser(id) {
  const key = `user:${id}`;

  const cached = await redis.get(key);
  if (cached) return JSON.parse(cached); // hit

  const { rows } = await pool.query("SELECT id, name FROM users WHERE id = $1", [id]);
  if (rows.length === 0) return null;

  await redis.set(key, JSON.stringify(rows[0]), "EX", 60); // expira em 60 s
  return rows[0];
}

Dois pontos pesam mais que o código:

  1. Todo cache precisa de TTL. O EX 60 faz a chave expirar em 60 segundos. Sem prazo, o cache vira uma cópia velha que ninguém invalida. Detalhes do comando em EXPIRE.
  2. Quando o dado muda no banco, invalide a chave (redis.del(key)) ou aceite que o cache fique defasado até o TTL acabar.

Como o cache é descartável, a persistência pode ficar desligada. A própria documentação do Redis cita o modo sem persistência como uma configuração usada às vezes em caches.

O que acontece quando o cache enche a memória?#

O limite de memória só existe se você configurar um. A diretiva maxmemory define o teto, e maxmemory-policy define o que fazer ao atingi-lo:

bash
redis-cli CONFIG SET maxmemory 256mb
redis-cli CONFIG SET maxmemory-policy allkeys-lru

Sem maxmemory, o limite em sistemas de 64 bits é zero, ou seja, não há teto: o Redis continua crescendo até esgotar a memória disponível na máquina ou no contêiner. As políticas mais usadas, segundo a documentação oficial:

  • noeviction: não remove nada e retorna erro nos comandos que adicionam dados. Comandos de leitura continuam funcionando.
  • allkeys-lru: remove as chaves usadas há mais tempo. A documentação a indica como boa opção padrão quando poucas chaves recebem a maior parte dos acessos.
  • allkeys-lfu: remove as chaves menos acessadas.
  • volatile-lru, volatile-ttl e variantes: só removem chaves que têm TTL. Sem nenhuma chave com expiração, elas se comportam como noeviction.

Para cache puro, allkeys-lru é o ponto de partida. Para o Redis como banco, use noeviction: um erro de memória cheia é melhor do que apagar dados em silêncio.

Como o Redis grava dados no disco?#

Existem duas formas de persistência, que você pode usar separadas ou juntas, segundo a documentação de persistência.

RDB: fotos periódicas#

O RDB salva uma foto do conjunto de dados num arquivo (dump.rdb) em intervalos definidos. Esta regra grava a cada 60 segundos se pelo menos 1000 chaves mudaram:

save 60 1000

O arquivo é compacto, bom para cópias de segurança, e acelera o reinício do Redis com bases grandes. O custo: se o processo cair sem um desligamento limpo, você perde o que foi escrito desde a última foto, em geral alguns minutos.

AOF: registro de cada escrita#

O AOF (append-only file) anexa cada comando de escrita a um log, que é reproduzido na inicialização para reconstruir os dados. Para ativar:

appendonly yes

A durabilidade depende da política appendfsync:

Política Comportamento Risco
always fsync a cada escrita Muito lento, o mais seguro
everysec fsync a cada segundo (padrão sugerido) Até cerca de 1 s de escritas
no Deixa o sistema operacional decidir O mais rápido, o menos seguro

O AOF costuma gerar arquivos maiores que o RDB e, dependendo da política de fsync, pode ser mais lento. O Redis reescreve o log em segundo plano para que ele não cresça sem parar.

RDB, AOF ou os dois?#

A documentação do Redis recomenda:

  • Quer segurança de dados comparável à de um banco como o PostgreSQL: use os dois.
  • Pode aceitar perder alguns minutos em caso de desastre: RDB sozinho basta.
  • AOF sozinho é comum, mas a documentação desencoraja, porque um RDB de tempos em tempos ajuda em cópias, em reinícios mais rápidos e em caso de bugs no motor do AOF.

Com os dois ativos, o Redis usa o AOF para reconstruir os dados no reinício, porque ele é o mais completo.

Quando usar cada modo?#

Use o Redis como cache quando:

  • a origem dos dados é outro banco e a consulta nele é lenta ou cara;
  • o dado pode ficar alguns segundos defasado;
  • a perda total do cache só causa lentidão temporária, não erro.

Use o Redis como banco quando:

  • o dado é naturalmente em memória e de acesso rápido: sessões, filas, contadores, limitação de taxa, rankings;
  • você aceita a janela de perda da persistência escolhida;
  • todo o conjunto cabe na RAM com folga.

Prefira outro banco quando o dado é relacional, precisa de consultas complexas ou não pode perder nem um segundo de escritas. Nesse caso, veja qual banco de dados escolher.

Dá para misturar os dois papéis numa instância, mas a documentação sugere separar em duas instâncias quando possível: um cache com remoção de chaves e um Redis persistente sem remoção.

Persistência é o mesmo que backup?#

Não. A persistência faz o Redis sobreviver a um restart no mesmo disco. Se o disco ou a máquina se perdem, os arquivos vão junto, então você ainda precisa de cópias fora da máquina. O arquivo RDB é seguro de copiar com o servidor em execução, porque nunca é modificado depois de pronto. O guia de como fazer backup de um banco de dados cobre a rotina completa.

Como fazer isso na Square Cloud#

A Square Cloud oferece hospedagem de Redis a partir do plano Standard, com persistência. Você cria o banco no painel, e ele fica pronto em segundos no mesmo datacenter das aplicações, com latência média de cerca de 1 ms. A conexão usa TLS obrigatório (rediss://, com o certificado baixado no painel). O plano Hobby não inclui hospedagem de banco.

Como o Redis guarda tudo na RAM, o tamanho do conjunto de dados define quanta memória você aloca para ele, a partir de 512 MB. Para cache, dê um TTL a cada chave, como no exemplo acima, para que o conjunto de dados não cresça sem teto. Há um único database lógico, então separe cache e dados permanentes por prefixo de chave. Use também um cliente que reconecte sozinho, porque clientes ociosos são desconectados após 5 minutos.

Você tira snapshots manuais quando quiser, e todo plano com bancos inclui também um snapshot automático diário. Um snapshot pode ser restaurado no mesmo banco, em outro do mesmo motor ou num banco novo, ou baixado como .zip. Veja hospedagem de Redis na Square Cloud e snapshots.

Hospedagem de bancos

MongoDB, PostgreSQL, MySQL e Redis no mesmo datacenter do app

Saiba mais

Perguntas frequentes

O Redis perde os dados quando reinicia?

Depende da persistência. Sem RDB nem AOF, tudo na memória some no restart. Com RDB você perde, no pior caso, o que foi escrito desde o último snapshot; com AOF em everysec, cerca de um segundo de escritas.

Posso usar o Redis como único banco da aplicação?

Pode, se aceitar as limitações: todo o conjunto de dados precisa caber na RAM e a durabilidade depende da persistência configurada. Para dados relacionais complexos, um banco como PostgreSQL costuma ser mais adequado.

Qual a diferença entre RDB e AOF?

O RDB grava fotos periódicas do conjunto de dados num arquivo compacto. O AOF registra cada escrita e pode ser reproduzido na inicialização, com durabilidade maior e arquivo maior.

O que acontece quando o Redis enche a memória?

Com maxmemory definido, o Redis aplica a política de remoção escolhida (por exemplo allkeys-lru) para liberar espaço. Com a política noeviction, ele recusa novos comandos de escrita e retorna erro.

Próximo artigoSQL ou NoSQL: qual banco escolherSQL guarda dados em tabelas com relações e esquema fixo. NoSQL reúne bancos de documentos, chave-valor e outros modelos. Veja as diferenças e quando usar cada um.

Mais em Bancos de dados

Ver todos os 24 artigos