Introdução aos Bancos de Dados em Memória e Sistemas de Cache

O que são bancos de dados em memória?

Conheça o armazenamento em memória, suas vantagens, limitações e diferenças em relação aos bancos de dados tradicionais.

Intermediário 45 min 30 pontos Leitura 0%

Nesta aula você vai

  • Definir banco de dados em memória e diferenciá-lo de cache tradicional
  • Explicar trade-offs entre RAM, disco e rede na arquitetura de dados
  • Reconhecer quando dados em memória são apropriados e quando não são

O que são bancos de dados em memória?

Objetivos

Nesta aula você vai:

  • Compreender o que caracteriza um banco de dados em memória (in-memory database)
  • Comparar armazenamento em RAM com persistência em disco
  • Identificar limitações de custo, capacidade e durabilidade

Introdução

Toda aplicação manipula dados temporários na memória RAM durante a execução — variáveis, objetos, buffers. Um banco de dados em memória vai além: é um sistema de gerenciamento projetado para armazenar dados primariamente na RAM, oferecendo interface de banco (comandos, protocolo, replicação) com latência ordens de magnitude menor que sistemas baseados em disco.

A confusão é comum: "Redis é um banco ou um cache?" A resposta honesta é depende do uso. Redis pode funcionar como cache efêmero ou como store com persistência. O que o define como in-memory database é a localização primária dos dados ativos — na memória — e o modelo de acesso otimizado para isso.

Conteúdo

Definição e arquitetura básica

Um banco em memória mantém estruturas de dados — tabelas, documentos, grafos ou chave-valor — diretamente na RAM do servidor (ou em memória compartilhada em clusters). O disco, quando presente, serve como:

  • Log de append (como AOF no Redis) para recuperação após falha
  • Snapshot periódico (como RDB) para backup
  • Tier secundário em soluções híbridas (dados frios no SSD, quentes na RAM)

A hierarquia clássica de armazenamento ilustra o ganho:

Camada Latência típica Capacidade Custo por GB
Registradores / L1 nanossegundos KB
RAM (DDR) ~100 ns GB a TB Alto
SSD NVMe ~100 µs TB Médio
HDD ~10 ms TB a PB Baixo
Rede (outro datacenter) dezenas de ms Variável

Operar na camada RAM significa que um GET ou SELECT evita seek de disco e desserialização pesada — daí a latência consistente em microssegundos.

In-memory database vs cache de aplicação

Aspecto Cache na aplicação (ex.: HashMap local) Banco em memória (ex.: Redis)
Compartilhamento Por processo/JVM Entre múltiplas instâncias
Durabilidade Perdido ao reiniciar o processo Opcional via persistência/replicação
Evicção Manual ou GC Políticas LRU, LFU, TTL
Protocolo Chamada de função TCP, cluster, ACL
Escala Limitada à máquina Sharding, cluster

Um ConcurrentHashMap na JVM resolve cache local; Redis resolve estado compartilhado entre dezenas de pods em Kubernetes.

Volatilidade, consistência e o mito da "perda total"

RAM é volátil: sem energia, o conteúdo desaparece. Por isso, bancos em memória implementam mecanismos de durabilidade assíncronos ou síncronos:

  • RDB: snapshot point-in-time em intervalos
  • AOF: log de cada comando de escrita
  • Replicação: cópia em outro nó antes de confirmar ao cliente (dependendo da configuração)

Nenhum sistema oferece garantias gratuitas: appendfsync always no Redis aumenta durabilidade e reduz throughput. Engenharia de dados em memória é, em grande parte, negociar latência versus durabilidade.

Quando usar e quando evitar

Adequado para:

  • Dados com alta taxa de leitura/escrita e baixa latência exigida
  • Sessões, tokens, rate limits, feature flags
  • Agregações em tempo real, contadores, rankings
  • Filas de curta duração e buffers entre sistemas

Evitar como fonte única de verdade para:

  • Dados regulatórios que exigem auditoria forte sem backup robusto
  • Volumes que excedem RAM disponível sem arquitetura de tiering
  • Workloads analíticos massivos (scan de bilhões de linhas) — OLAP em disco/coluna costuma vencer

Exemplos práticos

Verifique o uso de memória e a política de evicção no Redis:

redis-cli INFO memory

Saída relevante inclui used_memory_human, maxmemory e maxmemory_policy. Se maxmemory estiver definido e a política for allkeys-lru, o Redis remove chaves menos usadas quando a RAM enche — comportamento típico de cache, não de banco durável.

Para contrastar latência, um ping simples:

redis-cli --latency

Valores estáveis abaixo de 1 ms em rede local demonstram por que workloads sensíveis a latência migram para memória.

Persistência mínima para não perder tudo após restart:

# No redis.conf ou via CONFIG SET
CONFIG SET save "900 1 300 10 60 10000"
CONFIG SET appendonly yes

Isso transforma um store puramente volátil em sistema com recuperação possível após queda — característica de banco em memória maduro, não de cache local descartável.

Resumo

  • Bancos de dados em memória armazenam dados ativos na RAM, com protocolo e recursos de banco (replicação, persistência opcional).
  • O ganho principal é latência baixa e previsível; o custo é RAM cara e atenção à volatilidade.
  • Diferem de cache em processo por serem compartilhados, operáveis e escaláveis como infraestrutura.
  • Durabilidade é configurável — não é tudo-ou-nada — mas envolve trade-offs de performance.
  • Use para hot data e tempo real; combine com bancos em disco para cold data e conformidade.