Introdução
Bancos de dados chave-valor são amplamente utilizados em aplicações modernas por resolverem, de forma simples e eficiente, problemas comuns relacionados a latência, escalabilidade e flexibilidade de dados. Este artigo apresenta uma visão conceitual e prática sobre esse modelo, explicando desde seus fundamentos até um laboratório prático utilizando Redis e Docker.
O que é um banco de dados chave-valor?
Um banco de dados chave-valor é um tipo de banco NoSQL que armazena dados na forma de pares simples:
chave → valor
A chave é um identificador único, e o valor é um bloco de dados associado a essa chave. O banco não precisa interpretar o conteúdo do valor — ele apenas o armazena e o recupera.
Esse modelo é classificado como NoSQL porque abandona conceitos tradicionais dos bancos relacionais, como:
- Tabelas
- Relacionamentos
- Joins
- Esquemas rígidos
O objetivo principal é alcançar alto desempenho, flexibilidade de dados e escalabilidade horizontal.
Diferença para outros bancos NoSQL
Embora bancos como Redis e MongoDB pertençam à família NoSQL, eles resolvem problemas diferentes.
- Redis: foco em alta performance, com dados armazenados primariamente em memória.
- MongoDB: foco em persistência de documentos complexos, armazenados em disco.
A principal diferença está na forma de armazenamento e no tipo de carga de trabalho que cada um atende melhor.
Como funciona o armazenamento em bancos chave-valor?
O armazenamento ocorre por meio de pares simples:
- Chave: identificador único
- Valor: qualquer tipo de dado (strings, números, JSONs ou objetos serializados)
Essa estrutura é semelhante a um dicionário ou mapa.
Por não existir esquema ou validação estrutural, operações de leitura e escrita são extremamente rápidas.
Exemplos de uso comuns
- Carrinhos de compra
- Sessões de usuários
- Promoções temporárias
- Cache de dados frequentemente acessados
Um exemplo bastante conhecido no desenvolvimento front-end é o localStorage, uma API do HTML5 que permite armazenar dados no navegador do usuário no formato chave-valor.
Principais características
Estrutura simples
A chave localiza diretamente o valor. O banco não precisa entender o conteúdo armazenado.
Flexibilidade (schema-less)
Cada valor pode ter uma estrutura diferente, facilitando o armazenamento de dados não estruturados ou semipreenchidos.
Performance e escalabilidade
- Acesso direto pela chave
- Leitura e escrita em tempo constante (O(1))
- Fácil particionamento e escalabilidade horizontal
Acesso direto
Não existem índices complexos nem varredura de dados. A busca é feita diretamente pela chave.
Casos de uso mais comuns
- Cache de aplicações: Redis, Memcached
- Gerenciamento de sessão: dados de usuários em tempo real
- Filas e contadores: métricas, processamento assíncrono
Funcionamento em baixo nível
Em baixo nível, um banco chave-valor é essencialmente um sistema que mapeia um conjunto de bytes (chave) para outro conjunto de bytes (valor).
Internamente:
- Não existe conceito de tipo, tabela ou esquema
- Tudo é tratado como dados binários
Estrutura em memória
A implementação mais comum utiliza uma tabela hash:
- A chave (array de bytes) é passada por uma função hash
- O hash gera um índice na tabela
- Esse índice aponta para um bucket
- O bucket pode conter uma ou mais entradas
- Em caso de colisão, a comparação final é feita byte a byte
Se a chave for encontrada, o valor associado é retornado.
Persistência de dados
Embora muitos bancos chave-valor utilizem memória para alcançar alta performance, isso torna os dados voláteis.
Para resolver esse problema, mecanismos de persistência são utilizados.
Write-Ahead Log (WAL)
- Toda escrita é registrada primeiro em um log sequencial em disco
- Garante que os dados não sejam perdidos em caso de falha
MemTable
- Estrutura de dados mantida em memória (como Skip List ou Árvore balanceada)
- Escritas são feitas simultaneamente no log e na memória
- A resposta de sucesso é enviada após essas operações
Esse modelo realiza apenas operações de append, evitando sobrescritas em disco e aumentando a eficiência.
Por que esse modelo é tão utilizado?
- Resolve problemas de latência
- Reduz custo de acesso a bancos relacionais
- Evita múltiplas consultas repetidas
- Simplifica o modelo mental do desenvolvedor
A aplicação sabe exatamente qual chave buscar e recebe o valor diretamente, sem surpresas de performance.
Laboratório prático com Redis
Pré-requisitos
Você precisa ter instalado:
- Docker
- Docker Compose
Verifique:
docker --version
docker compose version
Estrutura do laboratório
redis-lab/
├── docker-compose.yml
└── README.md (opcional)
Criando o Redis com Docker
docker-compose.yml
version: "3.9"
services:
redis:
image: redis:7.2
container_name: redis-lab
ports:
- "6379:6379"
volumes:
- redis_data:/data
command: redis-server --appendonly yes
Conceitos envolvidos
-
redis:7.2: SGBD Redis - Porta
6379: porta padrão do Redis -
volumes: persistência de dados -
appendonly yes: grava operações em disco (AOF)
Mesmo bancos em memória podem oferecer persistência.
Subindo o banco
docker compose up -d
Verifique:
docker ps
Acessando o Redis
docker exec -it redis-lab redis-cli
Operações básicas
Inserindo dados
SET nome "Carlos"
SET idade 30
Buscando dados
GET nome
GET idade
Busca em tempo constante (O(1)).
Atualizando dados
SET idade 31
Atualizar significa sobrescrever o valor da chave.
Removendo dados
DEL nome
Tipos de dados no Redis
Strings
SET status "ativo"
Listas
LPUSH fila_emails "email1"
LPUSH fila_emails "email2"
LRANGE fila_emails 0 -1
Muito usadas como filas.
Contadores
SET visitas 0
INCR visitas
INCR visitas
GET visitas
Operações atômicas, ideais para métricas.
Hashes
HSET usuario:1 nome "Ana" idade 28 email "ana@email.com"
HGETALL usuario:1
Simulam registros estruturados.
TTL – dados temporários
SET codigo_verificacao "123456" EX 10
Após 10 segundos:
GET codigo_verificacao
Muito usado para sessões, tokens e cache.
Visualizando o estado do banco
KEYS *
⚠️ Em produção, esse comando é perigoso. Aqui é usado apenas para aprendizado.
Resumo mental
| Conceito | Redis |
|---|---|
| Modelo | Chave → Valor |
| Schema | Não existe |
| Join | Não |
| Velocidade | Muito alta |
| Persistência | Opcional |
| Uso comum | Cache, sessões, filas |
Encerrando o laboratório
docker compose down
Referências
- Redis Documentation – https://redis.io/docs
- Designing Data-Intensive Applications – Martin Kleppmann
- NoSQL Databases – https://www.mongodb.com/nosql-explained
- Log-Structured Storage – https://en.wikipedia.org/wiki/Log-structured_file_system
Top comments (2)
Totally agree — this is a clear, practical explanation of key-value databases and Redis, especially how you connected the concepts with a hands-on lab.
Muito massa mano 👏🏾