DEV Community

Emanoel Carvalho
Emanoel Carvalho

Posted on

Bancos de Dados Chave-Valor: Conceitos, Funcionamento e Laboratório com Redis

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
Enter fullscreen mode Exit fullscreen mode

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:

  1. A chave (array de bytes) é passada por uma função hash
  2. O hash gera um índice na tabela
  3. Esse índice aponta para um bucket
  4. O bucket pode conter uma ou mais entradas
  5. 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
Enter fullscreen mode Exit fullscreen mode

Estrutura do laboratório

redis-lab/
 ├── docker-compose.yml
 └── README.md (opcional)
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Verifique:

docker ps
Enter fullscreen mode Exit fullscreen mode

Acessando o Redis

docker exec -it redis-lab redis-cli
Enter fullscreen mode Exit fullscreen mode

Operações básicas

Inserindo dados

SET nome "Carlos"
SET idade 30
Enter fullscreen mode Exit fullscreen mode

Buscando dados

GET nome
GET idade
Enter fullscreen mode Exit fullscreen mode

Busca em tempo constante (O(1)).

Atualizando dados

SET idade 31
Enter fullscreen mode Exit fullscreen mode

Atualizar significa sobrescrever o valor da chave.

Removendo dados

DEL nome
Enter fullscreen mode Exit fullscreen mode

Tipos de dados no Redis

Strings

SET status "ativo"
Enter fullscreen mode Exit fullscreen mode

Listas

LPUSH fila_emails "email1"
LPUSH fila_emails "email2"
LRANGE fila_emails 0 -1
Enter fullscreen mode Exit fullscreen mode

Muito usadas como filas.

Contadores

SET visitas 0
INCR visitas
INCR visitas
GET visitas
Enter fullscreen mode Exit fullscreen mode

Operações atômicas, ideais para métricas.

Hashes

HSET usuario:1 nome "Ana" idade 28 email "ana@email.com"
HGETALL usuario:1
Enter fullscreen mode Exit fullscreen mode

Simulam registros estruturados.


TTL – dados temporários

SET codigo_verificacao "123456" EX 10
Enter fullscreen mode Exit fullscreen mode

Após 10 segundos:

GET codigo_verificacao
Enter fullscreen mode Exit fullscreen mode

Muito usado para sessões, tokens e cache.


Visualizando o estado do banco

KEYS *
Enter fullscreen mode Exit fullscreen mode

⚠️ 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
Enter fullscreen mode Exit fullscreen mode

Referências

Top comments (2)

Collapse
 
victor_elizondo_788328940 profile image
Victor Elizondo

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.

Collapse
 
paulojr_r profile image
Paulo Junior

Muito massa mano 👏🏾