Tipos de Dados Comuns no Redis

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 que hash-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.

Tags: Redis Hash List set Zset

Publicado em 7-6 02:18