Redis: Conjuntos Ordenados do Redis (Parte 2)
Esta lição aborda recursos avançados de conjuntos ordenados, como consultas por intervalo de pontuação e operações de conjunto.
1. ZRANGEBYSCORE: Consultar por Intervalo de Pontuação
ZRANGEBYSCORE recupera elementos com base em um intervalo de pontuação.
(1) Uso Básico
REDIS
ZADD leaderboard 100 "player1" 150 "player2" 200 "player3" 250 "player4" 300 "player5"
# Obter elementos com pontuações entre 150 e 250
ZRANGEBYSCORE leaderboard 150 250
1) "player2"
2) "player3"
3) "player4"
# Obter elementos com pontuações
ZRANGEBYSCORE leaderboard 150 250 WITHSCORES
1) "player2"
2) "150"
3) "player3"
4) "200"
5) "player4"
6) "250"
(2) Usando -inf e +inf
REDIS
# Obter elementos com pontuação <= 200
ZRANGEBYSCORE leaderboard -inf 200
1) "player1"
2) "player2"
3) "player3"
# Obter elementos com pontuação >= 200
ZRANGEBYSCORE leaderboard 200 +inf
1) "player3"
2) "player4"
3) "player5"
# Obter todos os elementos
ZRANGEBYSCORE leaderboard -inf +inf
(3) Intervalos Abertos e Fechados
REDIS
# Padrão é intervalo fechado [150, 250]
ZRANGEBYSCORE leaderboard 150 250
# Intervalo aberto (150, 250) — exclui 150 e 250
ZRANGEBYSCORE leaderboard (150 (250
# Semi-aberto [150, 250)
ZRANGEBYSCORE leaderboard 150 (250
# Semi-aberto (150, 250]
ZRANGEBYSCORE leaderboard (150 250
💡 Sintaxe: Use parênteses
( para indicar um intervalo aberto (exclusivo), sem parênteses para intervalo fechado (inclusivo).
(4) Paginação LIMIT
REDIS
# Obter elementos com pontuação 100-300, começando do índice 1, pegar 2
ZRANGEBYSCORE leaderboard 100 300 LIMIT 1 2
1) "player2"
2) "player3"
2. ZREVRANGEBYSCORE: Consultar por Intervalo de Pontuação (Maior para Menor)
REDIS
# Obter elementos com pontuação 150-250, do maior para o menor
ZREVRANGEBYSCORE leaderboard 250 150 WITHSCORES
1) "player4"
2) "250"
3) "player3"
4) "200"
5) "player2"
6) "150"
⚠️ Observação: O intervalo de pontuação em ZREVRANGEBYSCORE vai do maior para o menor (250 150), não do menor para o maior.
3. ZRANGEBYLEX: Consultar por Ordem Lexicográfica
Quando todos os elementos têm a mesma pontuação, você pode consultar por ordem lexicográfica (alfabética).
(1) Uso Básico
REDIS
# Todos os elementos têm pontuação 0
ZADD myzset 0 "apple" 0 "banana" 0 "cherry" 0 "date"
# Obter todos os elementos em ordem lexicográfica
ZRANGEBYLEX myzset - +
1) "apple"
2) "banana"
3) "cherry"
4) "date"
# Obter elementos no intervalo lexicográfico [banana, cherry]
ZRANGEBYLEX myzset [banana [cherry
1) "banana"
2) "cherry"
# Obter elementos começando com "b"
ZRANGEBYLEX myzset [b (c
1) "banana"
💡 Caso de uso: ZRANGEBYLEX é ideal para implementar autocomplete e consultas de dicionário.
4. ZREMRANGEBYRANK: Remover por Intervalo de Posição
REDIS
ZADD leaderboard 100 "p1" 150 "p2" 200 "p3" 250 "p4" 300 "p5"
# Remover elementos com posição 0 a 1 (2 menores pontuações)
ZREMRANGEBYRANK leaderboard 0 1
(integer) 2
ZRANGE leaderboard 0 -1
1) "p3"
2) "p4"
3) "p5"
5. ZREMRANGEBYSCORE: Remover por Intervalo de Pontuação
REDIS
ZADD leaderboard 100 "p1" 150 "p2" 200 "p3" 250 "p4" 300 "p5"
# Remover elementos com pontuações entre 100 e 200
ZREMRANGEBYSCORE leaderboard 100 200
(integer) 3
ZRANGE leaderboard 0 -1 WITHSCORES
1) "p4"
2) "250"
3) "p5"
4) "300"
(1) Caso de Uso: Limpar Dados Expirados
REDIS
# Fila atrasada (pontuação é timestamp)
ZADD delay:queue 1719129600 "task:1"
ZADD delay:queue 1719133200 "task:2"
# Remover tarefas concluídas (timestamp menor que o tempo atual)
ZREMRANGEBYSCORE delay:queue -inf 1719129600
6. ZREMRANGEBYLEX: Remover por Intervalo Lexicográfico
REDIS
ZADD myzset 0 "apple" 0 "banana" 0 "cherry" 0 "date"
# Remover elementos no intervalo lexicográfico [banana, cherry]
ZREMRANGEBYLEX myzset [banana [cherry
(integer) 2
ZRANGE myzset 0 -1
1) "apple"
2) "date"
7. Operações de Sorted Set
(1) ZUNIONSTORE: União
REDIS
# Criar dois conjuntos ordenados
ZADD zset1 1 "a" 2 "b" 3 "c"
ZADD zset2 4 "b" 5 "c" 6 "d"
# Calcular união (padrão: somar pontuações)
ZUNIONSTORE resultado 2 zset1 zset2
(integer) 4
ZRANGE resultado 0 -1 WITHSCORES
1) "a"
2) "1"
3) "d"
4) "6"
5) "b"
6) "6" # 2 + 4
7) "c"
8) "8" # 3 + 5
(2) ZUNIONSTORE com Pesos
REDIS
# Definir pesos
ZUNIONSTORE resultado 2 zset1 zset2 WEIGHTS 2 3
# pontuações do zset1 multiplicadas por 2, pontuações do zset2 multiplicadas por 3
ZRANGE resultado 0 -1 WITHSCORES
1) "a"
2) "2" # 1 * 2
3) "d"
4) "18" # 6 * 3
5) "b"
6) "16" # 2*2 + 4*3
7) "c"
8) "21" # 3*2 + 5*3
(3) ZUNIONSTORE Funções de Agregação
REDIS
# Usar agregação MIN (pegar a menor pontuação)
ZUNIONSTORE resultado 2 zset1 zset2 AGGREGATE MIN
# Usar agregação MAX (pegar a maior pontuação)
ZUNIONSTORE resultado 2 zset1 zset2 AGGREGATE MAX
# Usar agregação SUM (somar, padrão)
ZUNIONSTORE resultado 2 zset1 zset2 AGGREGATE SUM
(4) ZINTERSTORE: Interseção
REDIS
ZADD zset1 1 "a" 2 "b" 3 "c"
ZADD zset2 4 "b" 5 "c" 6 "d"
# Calcular interseção
ZINTERSTORE resultado 2 zset1 zset2
(integer) 2
ZRANGE resultado 0 -1 WITHSCORES
1) "b"
2) "6" # 2 + 4
3) "c"
4) "8" # 3 + 5
(5) ZDIFFSTORE: Diferença (Redis 6.2+)
REDIS
ZADD zset1 1 "a" 2 "b" 3 "c"
ZADD zset2 4 "b" 5 "c" 6 "d"
# Calcular diferença
ZDIFFSTORE resultado 2 zset1 zset2
(integer) 1
ZRANGE resultado 0 -1 WITHSCORES
1) "a"
2) "1"
8. ZMSCORE: Obter Pontuações em Lote (Redis 6.2+)
REDIS
ZADD leaderboard 100 "player1" 200 "player2" 300 "player3"
ZMSCORE leaderboard "player1" "player2" "player4"
1) "100"
2) "200"
3) (nil) # player4 não existe
9. ZPOPMAX e ZPOPMIN: Remover Elementos com Maior/Menor Pontuação
(1) ZPOPMAX: Remover o Elemento com Maior Pontuação
REDIS
ZADD leaderboard 100 "p1" 200 "p2" 300 "p3"
# Remover o elemento com maior pontuação
ZPOPMAX leaderboard
1) "p3"
2) "300"
# Remover 2 elementos com maior pontuação
ZPOPMAX leaderboard 2
1) "p2"
2) "200"
3) "p1"
4) "100"
(2) ZPOPMIN: Remover o Elemento com Menor Pontuação
REDIS
ZADD leaderboard 100 "p1" 200 "p2" 300 "p3"
ZPOPMIN leaderboard
1) "p1"
2) "100"
10. BZPOPMAX e BZPOPMIN: Remoção Bloqueante
REDIS
# Se o sorted set estiver vazio, bloquear e aguardar até 10 segundos
BZPOPMAX leaderboard 10
# Ouvir em múltiplos sorted sets
BZPOPMAX zset1 zset2 zset3 10
💡 Caso de uso: BZPOPMAX/BZPOPMIN podem ser usados para implementar filas de prioridade.
11. Aplicações Avançadas de Sorted Set
(1) Caso de Uso 1: Limitação de Taxa com Janela Deslizante
REDIS
# Registrar timestamps de requisições do usuário
ZADD ratelimit:user:1 1719129600 "req1"
ZADD ratelimit:user:1 1719129605 "req2"
ZADD ratelimit:user:1 1719129610 "req3"
# Contar requisições nos últimos 60 segundos
ZCOUNT ratelimit:user:1 1719129540 1719129600
# Limpar requisições mais antigas que 60 segundos
ZREMRANGEBYSCORE ratelimit:user:1 -inf 1719129540
(2) Caso de Uso 2: Autocomplete
REDIS
# Todas as palavras com pontuação 0
ZADD autocomplete 0 "apple" 0 "application" 0 "appetite" 0 "banana"
# Consultar palavras começando com "app"
ZRANGEBYLEX autocomplete [app [app\xff
1) "apple"
2) "application"
3) "appetite"
(3) Caso de Uso 3: Linha do Tempo
REDIS
# Linha do tempo do usuário (pontuação é timestamp)
ZADD timeline:user:1 1719129600 "post:1"
ZADD timeline:user:1 1719129605 "post:2"
ZADD timeline:user:1 1719129610 "post:3"
# Obter os 10 posts mais recentes
ZREVRANGE timeline:user:1 0 9
# Obter posts dentro de um intervalo de tempo
ZRANGEBYSCORE timeline:user:1 1719129600 1719129610
(4) Caso de Uso 4: Ranking Multidimensional
REDIS
# Ranking de vendas de produtos
ZADD sales:rank 1000 "product:1"
ZADD sales:rank 2000 "product:2"
# Ranking de avaliação de produtos
ZADD rating:rank 4.5 "product:1"
ZADD rating:rank 4.8 "product:2"
# Ranking combinado (peso vendas 0.6, peso avaliação 0.4)
ZUNIONSTORE combined:rank 2 sales:rank rating:rank WEIGHTS 0.6 0.4
▶ Exemplo
Operações avançadas de conjunto ordenado:
BASH
127.0.0.1:6379> ZADD scores 85 "Alice" 92 "Bob" 78 "Charlie"
(integer) 3
127.0.0.1:6379> ZRANGEBYSCORE scores 80 100
1) "Alice"
2) "Bob"
127.0.0.1:6379> ZINCRBY scores 5 "Charlie"
"83"
❓ Perguntas Frequentes
P Qual é a diferença entre ZRANGEBYSCORE e ZRANGE?
R ZRANGE consulta por intervalo de posição; ZRANGEBYSCORE consulta por intervalo de pontuação.
P Como obtenho os N primeiros elementos por pontuação?
R Use
ZREVRANGE key 0 N-1 WITHSCORES.P Como os pesos funcionam em ZUNIONSTORE?
R Pesos são multiplicadores. WEIGHTS 2 3 significa multiplicar pontuações do primeiro conjunto por 2 e do segundo conjunto por 3.
P ZRANGEBYLEX requer que todos os elementos tenham a mesma pontuação?
R Sim. ZRANGEBYLEX assume que todos os elementos têm a mesma pontuação e os ordena lexicograficamente.
P Como implemento uma fila de prioridade?
R Use ZADD para adicionar tarefas (pontuação = prioridade), e ZPOPMIN para remover a tarefa de maior prioridade.
📖 Resumo
- ZRANGEBYSCORE consulta por intervalo de pontuação, suporta intervalos abertos e LIMIT
- ZRANGEBYLEX consulta por ordem lexicográfica (todas as mesmas pontuações)
- ZREMRANGEBYRANK/SCORE/LEX remove elementos por intervalo
- ZUNIONSTORE/ZINTERSTORE operações de conjunto com pesos e agregações
- ZPOPMAX/ZPOPMIN remove elementos com maior/menor pontuação
- BZPOPMAX/BZPOPMIN remoção bloqueante para filas de prioridade
- Aplicações avançadas: limitação de taxa com janela deslizante, autocomplete, linha do tempo, ranking multidimensional
12. 📝 Atividades
- Consulta por intervalo de pontuação: Use ZRANGEBYSCORE para consultar elementos em diferentes intervalos de pontuação
- Exclusão por intervalo: Use ZREMRANGEBYSCORE para limpar dados expirados
- Operações de conjunto: Use ZUNIONSTORE para mesclar múltiplos rankings com diferentes pesos
- Janela deslizante: Use um sorted set para implementar limitação de taxa com janela deslizante
13. Próxima Lição
Na próxima lição, nós aprenderemos sobre HyperLogLog do Redis, abordando estimativa de cardinalidade.
📝 Exercícios
- Prática: Execute os comandos apresentados nesta lição
- Experimentação: Teste variações dos comandos aprendidos
- Aplicação: Aplique os conceitos em um projeto prático