Este artigo explora tipos de dados importantes no Redis: Hash, List, Set e Zset (conjunto ordenado). Abordaremos comandos essenciais, mecanismos de codificação interna e cenários de uso prático, com exemplos executáveis.
Hash (Dicionário)
Assim como em outras linguagens, o Redis oferece o tipo Hash, que funciona como um mapa ou dicionário. A relação interna é chamada de field-value, para diferenciar da chave principal do Redis (key-value).
Comandos Principais
HSET
Define o valor de um campo específico dentro de um hash.
HSET key field value [field value ...]
Retorno: Número de campos adicionados.
Exemplo:
127.0.0.1:6379> HSET usuario:1 nome Ana idade 30
(integer) 2
HGET
Obtém o valor de um campo específico.
HGET key field
Retorno: Valor do campo ou nil.
Exemplo:
127.0.0.1:6379> HGET usuario:1 nome
"Ana"
HEXISTS
Verifica se um campo existe no hash.
HEXISTS key field
Retorno: 1 (existe) ou 0 (não existe).
HDEL
Remove um ou mais campos do hash.
HDEL key field [field ...]
Retorno: Número de campos removidos.
HKEYS
Lista todos os campos do hash.
HKEYS key
Retorno: Lista de campos.
HVALS
Lista todos os valores do hash.
HVALS key
Retorno: Lista de valores.
HGETALL
Obtém todos os campos e seus respectivos valores.
HGETALL key
Retorno: Campos e valores alternados.
Nota: Use com cuidado em hashes grandes, pois pode causar bloqueio. Prefira HMGET para campos específicos.
HMGET
Obtém os valores de múltiplos campos de uma vez.
HMGET key field [field ...]
Retorno: Valores ou nil para campos inexistentes.
Codificação Interna
- ziplist (lista compactada): Usada quando o número de campos é menor que
hash-max-ziplist-entries(512 por padrão) e todos os valores são menores quehash-max-ziplist-value(64 bytes). É mais eficiente em memória. - hashtable (tabela hash): Usada quando as condições acima não são atendidas. Oferece acesso O(1).
Hash vs. Banco Relacional
- Hash é esparso: cada chave pode ter campos diferentes. Bancos relacionais são estruturados e exigem valores para todas as colunas.
- Consultas complexas (joins, agregações) são difíceis no Redis.
Comparação de Abordagens para Cache
1. Strings nativas (um campo por chave):
SET user:1:nome "Ana"
SET user:1:idade 30
Vantagem: Simples para alterar um campo. Desvantagem: Consome muitas chaves e memória.
2. String serializada (ex.: JSON):
SET user:1 '{"nome":"Ana","idade":30}'
Vantagem: Bom para operações no objeto completo. Desvantagem: Custo de serialização/desserialização; ruim para alterar campos isolados.
3. Hash:
HSET user:1 nome Ana idade 30
Vantagem: Simples, flexível e intuitivo. Desvantagem: Precisa gerenciar a transição entre ziplist e hashtable, que pode aumentar o uso de memória.
List (Lista)
Armazena uma sequência ordenada de strings, com até 2^32 - 1 elementos. Permite inserção e remoção em ambas as extremidades.
Características
- Ordenada por índice.
- Permite elementos duplicados.
- Inserção/remoção no início ou fim são rápidas (O(1)).
Comandos Principais
LPUSH
Insere elementos no início (esquerda) da lista.
LPUSH key element [element ...]
Retorno: Novo tamanho da lista.
LPUSHX
Similar ao LPUSH, mas só funciona se a chave já existe.
LPUSHX key element [element ...]
RPUSH
Insere elementos no fim (direita) da lista.
RPUSH key element [element ...]
RPUSHX
Similar ao RPUSH, mas só funciona se a chave já existe.
RPUSHX key element [element ...]
LRANGE
Obtém elementos em um intervalo de índices (fechado).
LRANGE key start stop
Exemplo: LRANGE minhaLista 0 -1 retorna todos os elementos.
LPOP / RPOP
Remove e retorna o primeiro (LPOP) ou o último (RPOP) elemento.
LPOP key
RPOP key
LINDEX
Obtém o elemento no índice específico.
LINDEX key index
LINSERT
Insere um elemento antes ou depois de um elemento pivô.
LINSERT key BEFORE|AFTER pivot element
Retorno: Novo tamanho da lista.
Versões com Bloqueio
BLPOP e BRPOP são versões bloqueantes de LPOP e RPOP. Se a lista estiver vazia, o comando espera por um tempo limite (timeout).
Codificação Interna
- ziplist: Usada quando a lista é pequena (menos de 512 elementos, cada um com menos de 64 bytes).
- linkedlist (lista enacdeada): Usada quando a lista não atende aos critérios do ziplist.
Cenários de Uso
Fila de Mensagens (Produtor-Consumidor)
Combine LPUSH (produtor) com BRPOP (consumidor) para implementar uma fila bloqueante.
Timeline de Rede Social
Armazene posts de um usuário em uma lista e use LRANGE para paginação.
# Adicionar posts à timeline do usuário 1
LPUSH timeline:1 post:1 post:2 post:3
# Obter os 10 posts mais recentes
LRANGE timeline:1 0 9
Set (Conjunto)
Armazena strings não ordenadas e sem duplicatas. Suporta operações de conjunto: interseção, união e diferença.
Comandos Principais
SADD
Adiciona um ou mais membros ao conjunto.
SADD key member [member ...]
Retorno: Número de membros adicionados.
SMEMBERS
Lista todos os membros do conjunto (ordem não garantida).
SMEMBERS key
SISMEMBER
Verifica se um membro existe.
SISMEMBER key member
Retorno: 1 ou 0.
SCARD
Retorna o número de membros.
SCARD key
SPOP
Remove e retorna um ou mais membros aleatórios.
SPOP key [count]
SMOVE
Move um membro de um conjunto para outro.
SMOVE source destination member
Retorno: 1 (sucesso) ou 0 (falha).
SREM
Remove um ou mais membros específicos.
SREM key member [member ...]
Operações de Conjunto
SINTER key [key ...]: Interseção.SUNION key [key ...]: União.SDIFF key [key ...]: Diferença.SINTERSTORE destination key [key ...]: Salva interseção em um novo conjunto.SUNIONSTORE destination key [key ...]: Salva união.SDIFFSTORE destination key [key ...]: Salva diferença.
Codificação Interna
- intset (conjunto de inteiros): Usado quando todos os membros são inteiros e há menos de
set-max-intset-entries(512 por padrão). Eficiente em memória. - hashtable: Usado para conjuntos maiores ou com membros não inteiros.
Cenário de Uso: Tags
Armazene tags (interesses) de usuários e encontre interesses comuns.
SADD usuario:1:tags esporte musica
SADD usuario:2:tags musica cinema
SINTER usuario:1:tags usuario:2:tags
# Resultado: "musica"
Zset (Conjunto Ordenado)
Similar ao Set, mas cada membro tem uma pontuação (score) do tipo ponto flutuante, usada para ordenação. Membros são únicos, mas pontuações podem se repetir.
Comandos Principais
ZADD
Adiciona ou atualiza membros com pontuações. Opções:
NX: Só adiciona novos.XX: Só atualiza existentes.CH: Retorna número de mudanças (adições + atualizações).INCR: Incrementa a pontuação.
ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]
Retorno: Número de elementos adicionados.
ZCARD
Retorna o número de membros.
ZCARD key
ZCOUNT
Conta membros com pontuação em um intervalo.
ZCOUNT key min max
ZRANGE
Retorna membros por intervalo de índice (ordem crescente).
ZRANGE key start stop [WITHSCORES]
ZPOPMAX
Remove e retorna os membros com maior pontuação.
ZPOPMAX key [count]
ZRANK
Retorna a posição (rank) de um membro em ordem crescente.
ZRANK key member
ZREVRANK
Retorna a posição em ordem decrescente.
ZREVRANK key member
ZSCORE
Retorna a pontuação de um membro.
ZSCORE key member
ZREM
Remove um ou mais membros.
ZREM key member [member ...]
ZREMRANGEBYRANK
Remove membros por intervalo de rank.
ZREMRANGEBYRANK key start stop
ZREMRANGEBYSCORE
Remove membros por intervalo de pontuação.
ZREMRANGEBYSCORE key min max
ZINCRBY
Incrementa a pontuação de um membro.
ZINCRBY key increment member
Retorno: Nova pontuação.
Cenário de Uso: Rankings
Ideal para sistemas de classificação (leaderboards).
# Adicionar pontuação de jogadores
ZADD ranking:jogo 1000 "JogadorA"
ZADD ranking:jogo 850 "JogadorB"
# Incrementar pontuação
ZINCRBY ranking:jogo 150 "JogadorA"
# Obter os 3 melhores
ZRANGE ranking:jogo 0 2 WITHSCORES
Varredura Progressiva (SCAN)
O comando KEYS pode bloquear o Redis. Use SCAN para uma varredura incremental.
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
Inicie com cursor 0. O comando retorna um novo cursor e uma lista de chaves. Quando o cursor retornar a 0, a varredura terminou.
Versões específicas para tipos de dados:
HSCAN: Para Hash.SSCAN: Para Set.ZSCAN: Para Zset.