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
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
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
- Prática de nomenclatura: Projete convenções de nomenclatura de chaves para um site de e-commerce (usuários, produtos, pedidos, carrinhos de compras)
- Prática de expiração: Defina uma chave com TTL, verifique o tempo restante com TTL e verifique após a expiração
- Prática de SCAN: Crie 100 chaves e use SCAN para iterar por todas elas
- 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.



