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 |
String
Strings são o tipo de dado mais básico do Redis. Elas podem armazenar:
- Strings (texto)
- Inteiros (numérico)
- Dados binários (imagens, objetos serializados)
Características
- Binary safe: pode armazenar qualquer dado (incluindo imagens, vídeos)
- Tamanho máximo: 512MB
- Suporta operações numéricas: INCR, DECR, INCRBY, etc.
- Suporta operações de bit: SETBIT, GETBIT, BITCOUNT, etc.
Comandos Básicos
# 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 |
Hash
Um hash é uma coleção chave-valor, similar a um Map, Dictionary ou Object em linguagens de programação.
Características
- Ideal para armazenar objetos (informações de usuário, informações de produto, etc.)
- Pode modificar campos individuais sem ler o objeto inteiro
- Eficiente em memória (usa ziplist para dados pequenos)
Comandos Básicos
# 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
SET user:1 '{"name":"Alice","age":25,"email":"alice@example.com"}'
- Prós: Simples
- Contras: Modificar um campo requer ler, modificar e escrever de volta o objeto inteiro
Método 2: Hash
HSET user:1 name "Alice" age 25 email "alice@example.com"
- Prós: Pode modificar campos individuais de forma independente
- Contras: Não suporta estruturas aninhadas complexas
List
Uma lista é uma sequência ordenada de strings, permitindo elementos duplicados.
Características
- Ordenada: elementos mantêm a ordem de inserção
- Repetível: o mesmo valor pode aparecer múltiplas vezes
- Operações em ambas as extremidades: pode inserir e remover de ambos os lados
- Tamanho máximo: 2^32 - 1 (cerca de 4.2 bilhões)
Comandos Básicos
# 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
# 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
Set
Um set é uma coleção não ordenada de strings únicas.
Características
- Não ordenado: elementos não têm ordem específica
- Único: deduplicação automática
- Suporta operações de conjunto: interseção, união, diferença
Comandos Básicos
# 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
# 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
# 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
Sorted Set
Um sorted set é uma coleção com pontuações, onde os elementos são ordenados pela pontuação.
Características
- Ordenado: elementos ordenados pela pontuação (ascendente)
- Único: elementos são únicos, mas pontuações podem se repetir
- Suporta consultas por intervalo: por pontuação ou posição
Comandos Básicos
# 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
# 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
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:
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
📖 Resumo
- Redis tem 5 tipos básicos de dados: String, Hash, List, Set, Sorted Set
- String: mais básica, armazena strings, inteiros, binários
- Hash: coleção chave-valor, ideal para objetos
- List: lista ordenada, adequada para filas de mensagens, listas recentes
- Set: coleção não ordenada, suporta operações de conjunto
- Sorted Set: coleção ordenada, ideal para rankings
- Escolha o tipo de dado certo com base no seu caso de uso
📝 Atividades
- Criar dados: Crie dados de exemplo para cada tipo de dado
- Comando TYPE: Use TYPE para verificar os tipos de dados que você criou
- 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?
- 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.



