Gerenciamento de Chaves do Redis

Chaves são a unidade fundamental de dados no Redis. Esta lição aborda operações de gerenciamento de chaves.

Operações Básicas de Chave

Definindo Chaves

REDIS
# Definir uma string
SET user:1 "Alice"

# Definir um hash
HSET user:2 name "Bob" age 30

# Definir uma lista
LPUSH articles "article1" "article2"

# Definir um conjunto
SADD tags:article1 "redis" "database"

# Definir um conjunto ordenado
ZADD leaderboard 100 "player1"

Obtendo Chaves

REDIS
# Obter uma string
GET user:1

# Obter um hash
HGETALL user:2

# Obter uma lista
LRANGE articles 0 -1

# Obter um conjunto
SMEMBERS tags:article1

# Obter um conjunto ordenado
ZRANGE leaderboard 0 -1 WITHSCORES

Deletando Chaves

REDIS
# Deletar uma única chave
DEL user:1
(integer) 1  # Retorna o número de chaves deletadas

# Deletar múltiplas chaves
DEL user:2 user:3
(integer) 2

# Deletar uma chave que não existe
DEL naoexiste
(integer) 0

Verificando se uma Chave Existe

REDIS
SET minhaChave "olá"

EXISTS minhaChave
(integer) 1  # Existe

EXISTS naoexiste
(integer) 0  # Não existe

# Verificar múltiplas chaves (retorna contagem de chaves existentes)
EXISTS minhaChave minhaChave2 minhaChave3
(integer) 1  # Apenas minhaChave existe

Verificando o Tipo da Chave

REDIS
SET minhaString "olá"
TYPE minhaString          # string

HSET meuHash campo "valor"
TYPE meuHash            # hash

LPUSH minhaLista "a"
TYPE minhaLista            # list

SADD meuSet "a"
TYPE meuSet             # set

ZADD meuZset 1 "a"
TYPE meuZset            # zset

TYPE naoexiste          # none

Convenções de Nomenclatura de Chaves

Uma boa nomenclatura de chaves torna o gerenciamento de dados mais claro.

Formato Recomendado

negócio:objeto:ID[:propriedade]

Exemplos

REDIS
# Informações do usuário
user:1                  # Informações básicas do Usuário 1
user:1:profile          # Perfil detalhado do Usuário 1
user:1:settings         # Configurações do Usuário 1

# Artigos
article:123             # Conteúdo do Artigo 123
article:123:comments    # Lista de comentários do Artigo 123
article:123:views       # Contagem de visualizações do Artigo 123

# Carrinho de compras
cart:user:1             # Carrinho de compras do Usuário 1

# Sessões
session:token:abc123    # Token de sessão

# Cache
cache:api:user:1        # Cache de API para informações do usuário 1
cache:page:home         # Cache de página para página inicial

# Locks
lock:order:123          # Lock para o pedido 123
▶ Experimente

Sugestões de Nomenclatura

Sugestão Exemplo Descrição
Use dois-pontos como separadores user:1:profile Hierarquia clara
Use prefixos significativos cache:, session:, lock: Distinguir diferentes propósitos
Mantenha consistência user:1, user:2 Formato unificado
Evite ser muito longo u:1:p Muito curto é confuso, muito longo usa memória
Evite caracteres especiais user-1 Use hífens ou dois-pontos, evite espaços
💡 Tamanho da chave: Nomes de chave ocupam memória. Equilibre clareza com concisão. Chaves usadas com frequência podem ser mais curtas.

Expiração

Redis pode definir um TTL (time-to-live) para chaves, deletando-as automaticamente quando expiram.

Definindo Expiração

REDIS
SET session:token123 "user_data"

# Método 1: EXPIRE (segundos)
EXPIRE session:token123 3600    # Expira após 1 hora

# Método 2: EXPIREAT (timestamp, segundos)
EXPIREAT session:token123 1700000000

# Método 3: PEXPIRE (milissegundos)
PEXPIRE session:token123 3600000

# Método 4: PEXPIREAT (timestamp, milissegundos)
PEXPIREAT session:token123 1700000000000

# Método 5: Definir expiração com SET
SET cache:key "valor" EX 60     # Expira após 60 segundos
SET cache:key "valor" PX 60000  # Expira após 60000 milissegundos

Verificando Expiração

REDIS
# TTL: retorna tempo restante (segundos)
TTL session:token123
(integer) 3500  # 3500 segundos restantes

# PTTL: retorna tempo restante (milissegundos)
PTTL session:token123
(integer) 3500000

# Valores especiais de retorno
TTL semexpiracao
(integer) -1    # Chave existe mas não tem expiração

TTL naoexiste
(integer) -2    # Chave não existe

Removendo Expiração

REDIS
# PERSIST: remove expiração, tornando a chave persistente
PERSIST session:token123
(integer) 1  # Removido com sucesso

PERSIST naoexiste
(integer) 0  # Chave não existe

Casos de Uso de Expiração

Cenário TTL Exemplo
Sessão 30 minutos SET session:token "data" EX 1800
Código de verificação 5 minutos SET code:phone:138xxxx "123456" EX 300
Cache 1 hora SET cache:api:user:1 "data" EX 3600
Limitação de taxa 1 minuto SET limit:user:1 "10" EX 60
Lock distribuído 10 segundos SET lock:resource "locked" NX EX 10
⚠️ Observação: A precisão da expiração é em milissegundos, mas a exclusão real pode ser atrasada (exclusão preguiçosa + exclusão periódica).

Renomeando Chaves

RENAME: Renomear uma Chave

REDIS
SET chaveantiga "valor"

RENAME chaveantiga chavenova
OK

GET chavenova
"valor"

GET chaveantiga
(nil)  # chaveantiga não existe mais
⚠️ Observação: Se chavenova já existir, RENAME vai substituí-la!

RENAMENX: Renomear Apenas se a Nova Chave Não Existir

REDIS
SET key1 "valor1"
SET key2 "valor2"

RENAMENX key1 key2
(integer) 0  # key2 já existe, renomeação falhou

GET key1
"valor1"  # key1 ainda existe

GET key2
"valor2"  # key2 não foi substituída

Migração de Chaves

MOVE: Mover uma Chave para Outro Banco de Dados

REDIS
# No DB 0
SET minhachave "valor"

# Mover para DB 1
MOVE minhachave 1
(integer) 1  # Sucesso

# Alternar para DB 1
SELECT 1
OK

GET minhachave
"valor"
⚠️ Observação: MOVE não está disponível em modo cluster.

DUMP + RESTORE: Serialização e Desserialização

REDIS
# Serializar uma chave
SET minhachave "olá"
DUMP minhachave
# Retorna dados binários serializados

# Restaurar para uma nova chave
RESTORE chavenova 0 "\x00\x05olá\t\x00\xf5\xbd\xba\xab\xdc\xa6\xdec"
OK

MIGRATE: Migrar uma Chave para Outra Instância Redis

REDIS
# Migrar minhachave para 192.168.1.100:6379
MIGRATE 192.168.1.100 6379 minhachave 0 5000
OK

# Explicação dos parâmetros
# MIGRATE host port key destination-db timeout

Ordenação de Chaves

O comando SORT pode ordenar listas, conjuntos e conjuntos ordenados.

Ordenação Básica

REDIS
# Ordenar uma lista
LPUSH mylist 3 1 4 1 5 9 2 6
SORT mylist
# 1) "1"
# 2) "1"
# 3) "2"
# 4) "3"
# 5) "4"
# 6) "5"
# 7) "6"
# 8) "9"

# Ordenação descendente
SORT mylist DESC
# 1) "9"
# 2) "6"
# 3) "5"
# ...

# Ordenar um conjunto
SADD myset 5 2 8 1 9
SORT myset
# 1) "1"
# 2) "2"
# 3) "5"
# 4) "8"
# 5) "9"

Ordenação por Valores Externos

REDIS
# Lista de IDs de alunos
LPUSH students "student1" "student2" "student3"

# Pontuações dos alunos
SET student1:score 85
SET student2:score 92
SET student3:score 78

# Ordenar por pontuação
SORT students BY *:score
# 1) "student3"  # 78 pontos
# 2) "student1"  # 85 pontos
# 3) "student2"  # 92 pontos

# Obter valores externos
SORT students BY *:score GET *:score
# 1) "78"
# 2) "85"
# 3) "92"

Salvando Resultados de Ordenação

REDIS
# Ordenar e salvar em uma nova chave
SORT mylist DESC STORE sorted_list
(integer) 8

LRANGE sorted_list 0 -1
# 1) "9"
# 2) "6"
# ...

Encontrando Chaves

KEYS: Encontrar Chaves Correspondentes

REDIS
# Definir alguns dados de teste
SET user:1 "Alice"
SET user:2 "Bob"
SET user:3 "Charlie"
SET product:1 "iPhone"
SET product:2 "iPad"

# Encontrar todas as chaves
KEYS *
# 1) "user:1"
# 2) "user:2"
# 3) "user:3"
# 4) "product:1"
# 5) "product:2"

# Encontrar chaves que correspondem a um padrão
KEYS user:*
# 1) "user:1"
# 2) "user:2"
# 3) "user:3"

KEYS *:1
# 1) "user:1"
# 2) "product:1"

KEYS user:[1-2]
# 1) "user:1"
# 2) "user:2"
⚠️ Atenção: KEYS escaneia o banco de dados inteiro. É muito lento com grandes conjuntos de dados — não use em produção!

SCAN: Iterar por Chaves (Recomendado)

SCAN é uma alternativa segura ao KEYS, usando iteração baseada em cursor.

REDIS
# Iniciar iteração, retorna cursor e lista de chaves
SCAN 0
1) "5"          # Cursor para a próxima iteração
2) 1) "user:1"
   2) "user:2"

# Continuar iteração
SCAN 5
1) "0"          # Cursor 0 significa que a iteração está completa
2) 1) "user:3"
   2) "product:1"

# Corresponder padrão
SCAN 0 MATCH user:*
1) "3"
2) 1) "user:1"
   2) "user:2"

# Especificar contagem por iteração
SCAN 0 COUNT 100

Comandos da Família SCAN

REDIS
# Iterar elementos de um conjunto
SSCAN myset 0

# Iterar campos de um hash
HSCAN myhash 0

# Iterar elementos de um conjunto ordenado
ZSCAN myzset 0
💡 Vantagem do SCAN: Não bloqueia o servidor; pode processar grandes números de chaves em lotes.

Notificações de Keyspace

Redis pode notificar clientes sobre eventos de alteração de chaves.

Configurando Notificações de Keyspace

REDIS
# Visualizar configuração
CONFIG GET notify-keyspace-events
1) "notify-keyspace-events"
2) ""  # Desabilitado por padrão

# Habilitar todas as notificações
CONFIG SET notify-keyspace-events AKE
OK

Tipos de Notificação

Caractere Tipo de Notificação Descrição
K Keyspace Notificação de keyspace (keyspace@)
E Keyevent Notificação de evento de chave (keyevent@)
A Todas Todas as notificações (equivalente a KE$glsh)
$ String Comandos de string
l List Comandos de lista
s Set Comandos de conjunto
h Hash Comandos de hash
z Sorted Set Comandos de conjunto ordenado
x Expired Eventos de expiração
e Evicted Eventos de remoção (remoção por memória)

Assinando Notificações

REDIS
# Assinar notificações de keyspace (todos os eventos para uma chave)
SUBSCRIBE __keyspace@0__:minhachave

# Assinar notificações de keyevent (um evento específico para todas as chaves)
SUBSCRIBE __keyevent@0__:set

Exemplo: Monitorando Chaves Expiradas

REDIS
# Configurar: habilitar notificações de expiração
CONFIG SET notify-keyspace-events Ex
OK

# Cliente 1: assinar eventos expirados
SUBSCRIBE __keyevent@0__:expired

# Cliente 2: definir uma chave com expiração
SET temp "valor" EX 5

# Cliente 1 recebe:
# 1) "message"
# 2) "__keyevent@0__:expired"
# 3) "temp"  # O nome da chave expirada
▶ Experimente

Informações da Chave

Comando OBJECT

REDIS
SET minhachave "olá"

# Ver codificação interna da chave
OBJECT ENCODING minhachave
"embstr"

# Ver contagem de referência
OBJECT REFCOUNT minhachave
(integer) 1

# Ver tempo de inatividade (segundos)
OBJECT IDLETIME minhachave
(integer) 10

Comando MEMORY (Redis 4.0+)

REDIS
SET minhachave "olá mundo olá mundo olá mundo"

# Ver uso de memória da chave
MEMORY USAGE minhachave
(integer) 56  # Bytes

# Ver detalhes de alocação de memória
MEMORY STATS

STRLEN: Obter Tamanho da String

REDIS
SET minhachave "Olá Redis"
STRLEN minhachave
(integer) 10

Operações em Lote

Configuração em Lote

REDIS
MSET key1 "valor1" key2 "valor2" key3 "valor3"
OK

Obtenção em Lote

REDIS
MGET key1 key2 key3
1) "valor1"
2) "valor2"
3) "valor3"

# Incluindo chaves que não existem
MGET key1 key2 naoexiste key3
1) "valor1"
2) "valor2"
3) (nil)
4) "valor3"

Exclusão em Lote

REDIS
# Deletar múltiplas chaves
DEL key1 key2 key3
(integer) 3

❓ Perguntas Frequentes

P Por que o comando KEYS é lento?
R KEYS escaneia o banco de dados inteiro com complexidade de tempo O(N). Ele bloqueia o Redis quando o conjunto de dados é grande. Use SCAN.
P Quando as chaves expiradas são deletadas?
R Redis usa exclusão preguiçosa + exclusão periódica. Ele verifica a expiração quando uma chave é acessada, e periodicamente verifica uma amostra aleatória de chaves em segundo plano.
P Como deleto chaves em lote que correspondem a um padrão?
R

BASH
redis-cli --scan --pattern "prefix:*" | xargs redis-cli DEL

Q: Qual é o tamanho máximo do nome de uma chave? A: Teoricamente ilimitado, mas manter curto é recomendado (eles ocupam memória).

P Como conto chaves de um tipo específico?
R Não há comando direto. Você precisa iterar com SCAN e verificar com TYPE.

📖 Resumo

  • Operações básicas de chave: SET, GET, DEL, EXISTS, TYPE
  • Nomenclatura de chaves: use dois-pontos como separadores com prefixos significativos
  • Expiração: EXPIRE, TTL, PERSIST
  • Encontrar chaves: KEYS (use com cuidado), SCAN (recomendado)
  • Migração de chaves: MOVE, MIGRATE, DUMP/RESTORE
  • Ordenação de chaves: comando SORT
  • Notificações de keyspace: ouvir eventos de alteração de chaves

📝 Atividades

  1. Prática de nomenclatura: Projete convenções de nomenclatura de chaves para um site de e-commerce (usuários, produtos, pedidos, carrinhos de compras)
  2. Prática de expiração: Defina uma chave com TTL, verifique o tempo restante com TTL e verifique após a expiração
  3. Prática de SCAN: Crie 100 chaves e use SCAN para iterar por todas elas
  4. Operações em lote: Use MSET para definir 10 chaves e MGET para recuperá-las

Próxima Lição

Na próxima lição, nós aprenderemos sobre Strings do Redis (Parte 1), aprofundando em operações básicas de string.

100%