Visão Geral dos Tipos de Dados do Redis

Redis suporta 5 tipos básicos de dados, cada um com características e casos de uso únicos. Esta lição fornece uma visão geral de todos os tipos de dados.

Visão Geral dos Tipos de Dados do Redis

Tipo de Dado Descrição Implementação Interna Casos de Uso
String Tipo mais básico, armazena strings, inteiros, dados binários SDS (Simple Dynamic String) Cache, contadores, locks distribuídos
Hash Coleção chave-valor, como Map/Objeto Tabela hash + ziplist Armazenar objetos, carrinhos de compras
List Lista ordenada e repetível de strings Lista duplamente encadeada + ziplist Filas de mensagens, listas recentes
Set Coleção não ordenada de strings únicas Tabela hash + intset Tags, relacionamentos sociais
Sorted Set Coleção ordenada e única com pontuação por elemento Skip list + tabela hash Rankings, coleções ponderadas
💡 Por que o Redis é rápido? Todos os dados estão em memória, e ele usa estruturas de dados eficientes (tabelas hash, skip lists, etc.).

String

Strings são o tipo de dado mais básico do Redis. Elas podem armazenar:

Características

Comandos Básicos

REDIS
# Definir e obter
SET key value
GET key

# Operações numéricas
INCR key          # Incrementar em 1
INCRBY key 10     # Incrementar em 10
DECR key          # Decrementar em 1

# Outras operações
APPEND key sufixo  # Anexar
STRLEN key         # Obter tamanho

Casos de Uso

Cenário Exemplo
Cache SET user:1:profile '{"name":"Alice"}'
Contador INCR article:123:views
Lock distribuído SET lock:resource "locked" NX EX 10
Sessão SET session:token123 "user_data" EX 3600
💡 Princípio do lock distribuído: O parâmetro NX (definir apenas se a chave não existir) combinado com EX (expiração) do comando SET fornece aquisição atômica de lock.

Hash

Um hash é uma coleção chave-valor, similar a um Map, Dictionary ou Object em linguagens de programação.

Características

Comandos Básicos

REDIS
# Definir e obter campos
HSET user:1 name "Alice"
HSET user:1 age 25
HGET user:1 name        # "Alice"

# Definir múltiplos campos
HMSET user:2 name "Bob" age 30 city "Beijing"

# Obter todos os campos e valores
HGETALL user:2
# 1) "name"
# 2) "Bob"
# 3) "age"
# 4) "30"
# 5) "city"
# 6) "Beijing"

# Obter múltiplos campos
HMGET user:2 name age
# 1) "Bob"
# 2) "30"

# Deletar um campo
HDEL user:2 city

# Verificar se campo existe
HEXISTS user:2 name    # 1

# Obter todos os nomes de campos
HKEYS user:2
# 1) "name"
# 2) "age"

# Obter todos os valores
HVALS user:2
# 1) "Bob"
# 2) "30"

# Obter número de campos
HLEN user:2            # 2

Casos de Uso

Cenário Exemplo
Armazenar objetos HSET user:1 name "Alice" age 25 email "alice@example.com"
Carrinho de compras HSET cart:user1 product:101 2 product:102 1 (ID do produto e quantidade)
Grupo de contadores HINCRBY article:123 likes 1

Hash vs String para Armazenar Objetos

Método 1: String com JSON

REDIS
SET user:1 '{"name":"Alice","age":25,"email":"alice@example.com"}'

Método 2: Hash

REDIS
HSET user:1 name "Alice" age 25 email "alice@example.com"
💡 Recomendação: Use Hash para objetos simples, use String com JSON para objetos aninhados complexos.

List

Uma lista é uma sequência ordenada de strings, permitindo elementos duplicados.

Características

Comandos Básicos

REDIS
# Inserir à esquerda (cabeça)
LPUSH mylist "a" "b" "c"  # Retorna o tamanho da lista

# Inserir à direita (cauda)
RPUSH mylist "d" "e"

# Obter tamanho da lista
LLEN mylist               # 5

# Obter elementos em um intervalo
LRANGE mylist 0 -1        # Obter todos os elementos
# 1) "c"
# 2) "b"
# 3) "a"
# 4) "d"
# 5) "e"

# Obter elemento em um índice específico
LINDEX mylist 0           # "c" (primeiro elemento)

# Remover da esquerda (cabeça)
LPOP mylist               # "c"

# Remover da direita (cauda)
RPOP mylist               # "e"

# Definir elemento em um índice específico
LSET mylist 0 "new"

# Remover elementos por valor
LREM mylist 1 "a"         # Remover 1 elemento com valor "a"

Casos de Uso

Cenário Descrição
Fila de mensagens LPUSH + RPOP ou RPUSH + LPOP
Lista recente Artigos mais recentes, comentários recentes
Linha do tempo Feed do usuário, linha do tempo de microblog

Exemplo: Fila de Mensagens

BASH
# Produtor: enviar mensagens para a fila
LPUSH queue:email "enviar para user1"
LPUSH queue:email "enviar para user2"

# Consumidor: retirar mensagens da fila
RPOP queue:email
RPOP queue:email

# Retirada bloqueante (bloqueia quando não há mensagens)
BRPOP queue:email 10
▶ Experimente
💡 LPUSH + RPOP = Fila (FIFO), LPUSH + LPOP = Pilha (LIFO)

Set

Um set é uma coleção não ordenada de strings únicas.

Características

Comandos Básicos

REDIS
# Adicionar elementos
SADD myset "a" "b" "c"

# Obter todos os elementos
SMEMBERS myset
# 1) "a"
# 2) "b"
# 3) "c"

# Verificar se elemento existe
SISMEMBER myset "a"      # 1 (existe)

# Remover elementos
SREM myset "a"

# Obter tamanho do conjunto
SCARD myset              # 2

# Obter um elemento aleatório
SRANDMEMBER myset

# Remover um elemento aleatório
SPOP myset

Operações de Conjunto

REDIS
# Criar dois conjuntos
SADD set1 "a" "b" "c"
SADD set2 "b" "c" "d"

# Interseção (elementos em ambos os conjuntos)
SINTER set1 set2
# 1) "b"
# 2) "c"

# União (elementos em qualquer um dos conjuntos)
SUNION set1 set2
# 1) "a"
# 2) "b"
# 3) "c"
# 4) "d"

# Diferença (elementos em set1 mas não em set2)
SDIFF set1 set2
# 1) "a"

# Armazenar resultado em um novo conjunto
SINTERSTORE result set1 set2

Casos de Uso

Cenário Descrição
Sistema de tags Tags de usuário, tags de artigo
Relacionamentos sociais Listas de amigos, listas de seguidores
Amigos em comum Interseção dos conjuntos de amigos de dois usuários
Sistema de recomendação Pessoas que você talvez conheça = amigos dos meus amigos - meus amigos - eu

Exemplo: Amigos em Comum

BASH
# Amigos do Usuário 1
SADD friends:user1 "Alice" "Bob" "Charlie"

# Amigos do Usuário 2
SADD friends:user2 "Bob" "Charlie" "David"

# Amigos em comum
SINTER friends:user1 friends:user2
▶ Experimente

Sorted Set

Um sorted set é uma coleção com pontuações, onde os elementos são ordenados pela pontuação.

Características

Comandos Básicos

REDIS
# Adicionar elementos (com pontuação)
ZADD leaderboard 100 "Alice"
ZADD leaderboard 95 "Bob"
ZADD leaderboard 98 "Charlie"

# Obter pontuação do elemento
ZSCORE leaderboard "Alice"    # "100"

# Obter posição do elemento (base 0, ascendente por pontuação)
ZRANK leaderboard "Alice"     # 2 (3º lugar)

# Obter posição do elemento (descendente por pontuação)
ZREVRANK leaderboard "Alice"  # 0 (1º lugar)

# Obter elementos por intervalo de posição (ascendente)
ZRANGE leaderboard 0 -1 WITHSCORES
# 1) "Bob"
# 2) "95"
# 3) "Charlie"
# 4) "98"
# 5) "Alice"
# 6) "100"

# Obter elementos por intervalo de posição (descendente)
ZREVRANGE leaderboard 0 -1 WITHSCORES
# 1) "Alice"
# 2) "100"
# 3) "Charlie"
# 4) "98"
# 5) "Bob"
# 6) "95"

# Obter elementos por intervalo de pontuação
ZRANGEBYSCORE leaderboard 95 100 WITHSCORES

# Incrementar pontuação do elemento
ZINCRBY leaderboard 5 "Bob"   # A pontuação do Bob passa a ser 100

# Remover elemento
ZREM leaderboard "Bob"

# Obter tamanho do conjunto
ZCARD leaderboard

# Contar elementos dentro de um intervalo de pontuação
ZCOUNT leaderboard 90 100

Casos de Uso

Cenário Descrição
Ranking Ranking de jogos, lista de tendências
Tags ponderadas Tags + peso
Fila atrasada Pontuação é o timestamp de execução
Janela deslizante Estatísticas de dados dentro de uma janela de tempo

Exemplo: Ranking de Jogos

BASH
# Atualizar pontuações dos jogadores
ZADD game:leaderboard 1500 "player1"
ZADD game:leaderboard 2300 "player2"
ZADD game:leaderboard 1800 "player3"

# Obter top 10
ZREVRANGE game:leaderboard 0 9 WITHSCORES

# Obter posição do jogador
ZREVRANK game:leaderboard "player1"

# Obter jogadores com pontuações entre 1000-2000
ZRANGEBYSCORE game:leaderboard 1000 2000 WITHSCORES
▶ Experimente

Guia de Seleção de Tipo de Dado

Árvore de Decisão

O que você precisa armazenar?
├─ Valor único (string, número, binário)
│  └─ Use String
│
├─ Objeto (múltiplos campos)
│  ├─ Campos frequentemente modificados individualmente
│  │  └─ Use Hash
│  └─ Campos raramente modificados individualmente
│     └─ Use String (JSON)
│
├─ Lista ordenada
│  ├─ Precisa de operações em ambas as extremidades
│  │  └─ Use List
│  └─ Precisa de ordenação por pontuação
│     └─ Use Sorted Set
│
└─ Coleção não ordenada
   ├─ Precisa de deduplicação
   │  └─ Use Set
   └─ Precisa de deduplicação + ordenação
      └─ Use Sorted Set

Resumo Comparativo

Característica String Hash List Set Sorted Set
Ordenado - -
Repetível - -
Operações numéricas
Operações de conjunto
Consultas por intervalo
Modificar campo único

Comando TYPE

Use o comando TYPE para verificar o tipo de dado de uma chave:

REDIS
SET mystring "olá"
TYPE mystring          # string

HSET myhash campo "valor"
TYPE myhash            # hash

LPUSH mylist "a"
TYPE mylist            # list

SADD myset "a"
TYPE myset             # set

ZADD myzset 1 "a"
TYPE myzset            # zset

❓ Perguntas Frequentes

P Quantos dados uma String pode armazenar?
R Máximo 512MB. No entanto, armazenar dados muito grandes não é recomendado, pois afeta o desempenho.
P Qual é melhor para armazenar objetos — Hash ou String?
R Use Hash para objetos simples (campos individuais podem ser modificados), use String (JSON) para objetos aninhados complexos.
P Quantos elementos uma List pode armazenar?
R Até 2^32-1 (cerca de 4.2 bilhões), mas praticamente limitado pela memória disponível.
P Qual é a diferença entre Set e List?
R Sets são não ordenados com elementos únicos; Lists são ordenadas e permitem duplicatas. Use Set para deduplicação, List para sequências ordenadas.
P As pontuações do Sorted Set podem ser decimais?
R Sim, as pontuações são números de ponto flutuante de precisão dupla.

📖 Resumo

📝 Atividades

  1. Criar dados: Crie dados de exemplo para cada tipo de dado
  2. Comando TYPE: Use TYPE para verificar os tipos de dados que você criou
  3. Pensar em cenários: Para um site de e-commerce, quais tipos de dados você usaria para informações de produto, carrinho de compras e lista de pedidos?
  4. Operações de conjunto: Crie listas de seguidores de dois usuários e calcule os seguidores em comum

Próxima Lição

Na próxima lição, nós aprenderemos sobre Gerenciamento de Chaves do Redis, aprofundando em operações e gerenciamento de chaves.

100%