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.
ZRANGEBYSCORE: Consultar por Intervalo de Pontuação
ZRANGEBYSCORE recupera elementos com base em um intervalo de pontuação.
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"
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
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).
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"
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.
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).
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.
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"
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"
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
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"
Operações de Sorted Set
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
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
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
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
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"
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
ZPOPMAX e ZPOPMIN: Remover Elementos com Maior/Menor Pontuação
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"
ZPOPMIN: Remover o Elemento com Menor Pontuação
REDIS
ZADD leaderboard 100 "p1" 200 "p2" 300 "p3"
ZPOPMIN leaderboard
1) "p1"
2) "100"
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.
Aplicações Avançadas de Sorted Set
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
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"
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
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
❓ 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
📝 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
Próxima Lição
Na próxima lição, nós aprenderemos sobre HyperLogLog do Redis, abordando estimativa de cardinalidade.



