O TairZset (exZset) estende os conjuntos ordenados do Redis com pontuação multidimensional. Esse recurso permite classificar membros com base em até 256 pontuações de ponto flutuante de precisão dupla, aplicando prioridade da esquerda para a direita.
Visão geral
Os conjuntos ordenados do Redis suportam apenas uma única pontuação por membro, o que dificulta a classificação multidimensional. Soluções alternativas comuns, como combinar pontuações com codificação IEEE 754 ou concatenação de strings, causam perda de precisão, exigem lógica complexa de codificação e decodificação e impedem o incremento atômico de dimensões individuais de pontuação.
O TairZset resolve esse problema com uma estrutura de dados nativa multidimensional:
Até 256 dimensões de pontuação por membro, formatadas como
score1#score2#...#scoreNPrioridade da esquerda para a direita: ao comparar dois membros, o sistema avalia primeiro a primeira dimensão; se forem iguais, compara a segunda dimensão, e assim por diante
Incrementos atômicos: o comando
EXZINCRBYincrementa uma dimensão específica sem ciclos de leitura-modificação-escritaCompatibilidade de API: os comandos espelham os comandos nativos de conjuntos ordenados, eliminando a necessidade de lógica de codificação ou decodificação no cliente
Rankings regulares e distribuídos: suporta arquiteturas de ranking tanto para nó único quanto distribuídas
Cliente TairJedis open source: disponível em TairJedis SDK. Use o código open source como referência para implementar clientes em outras linguagens
O módulo é open source e está disponível em TairZset no GitHub.
Casos de uso
A pontuação multidimensional torna o TairZset ideal para qualquer ranking em que uma única métrica não seja suficiente:
Rankings de transmissões ao vivo: classifique streamers primeiro por popularidade, depois por curtidas e, em seguida, pelo valor de presentes —
popularity#likes#gift_amountQuadros de medalhas: ordene competidores por medalhas de ouro, seguidas por prata e bronze —
gold#silver#bronzeRankings de jogos: classifique jogadores por pontuação, tempo de conclusão de tarefas e nível do jogador —
score#completion_time#player_rank
Como funciona a comparação multidimensional
O TairZset compara as pontuações dimensão por dimensão, da esquerda para a direita. Considere uma pontuação de duas dimensões score1#score2:
0#99vs99#90vs99#99: como0 < 99, o resultado é0#99 < 99#90 < 99#99Considere o caractere
#como um separador decimal:0.99 < 99.90 < 99.99
Se todas as dimensões forem iguais, o TairZset classifica os membros pelo nome em ordem ASCII.
Pré-requisitos
Antes de começar, verifique se você tem:
Uma instância otimizada para memória do Tair
Para instâncias otimizadas para memória compatíveis com Redis 5.0: versão secundária 1.7.1 ou posterior
Atualize para a versão secundária mais recente para obter o máximo de recursos e maior estabilidade. Consulte Atualizar a versão secundária de uma instância . Para instâncias cluster ou instâncias com divisão de leitura e escrita, atualize também os nós proxy para garantir a execução correta de todos os comandos.
Observações de uso
Todos os comandos do TairZset operam sobre dados do TairZset em instâncias Tair. A execução desses comandos em uma chave que contenha um tipo de dados diferente retorna um erro.
Consistência no formato de pontuação: todos os membros na mesma chave devem usar o mesmo número de dimensões de pontuação. Misturar
1#2#3e1#2na mesma chave causa erro.Formato de incremento: o parâmetro
incrementno comandoEXZINCRBYdeve corresponder ao formato de dimensão de pontuação do membro alvo. Para incrementar apenas uma dimensão de uma pontuação de três dimensões, especifique todas as três dimensões (por exemplo,EXZINCRBY key 0#1#0 member).Os valores
+infe-infsão válidos em todos os comandos de intervalo de pontuação.
Início rápido
O exemplo a seguir cria um ranking de transmissões ao vivo com duas dimensões: classificação primeiro por popularidade e depois por curtidas.
# Add streamers with initial scores (popularity#likes)
EXZADD leaderboard 1000#500 alice 800#900 bob 1000#300 carol
# Atomically increment alice's likes without a read-modify-write cycle
EXZINCRBY leaderboard 0#100 alice
# Get the full leaderboard, highest score first
EXZREVRANGE leaderboard 0 -1 WITHSCORES
# 1) "alice"
# 2) "1000#600"
# 3) "carol"
# 4) "1000#300"
# 5) "bob"
# 6) "800#900"
# Get alice's rank (highest = rank 0)
EXZREVRANK leaderboard alice
# (integer) 0
Comandos
A tabela a seguir lista todos os comandos do TairZset. Use o comando nativo do Redis DEL para excluir chaves do TairZset.
|
Comando |
Sintaxe |
Complexidade |
Descrição |
|
|
|
XX] [CH] [INCR] score member [score member ...]` |
O(M\*log(N)) |
Adiciona ou atualiza membros com pontuações |
|
|
|
O(log(N)) |
Incrementa a pontuação de um membro |
||
|
|
O(1) |
Obtém a pontuação de um membro |
||
|
|
O(log(N)+M) |
Retorna membros por intervalo de índice, do menor para o maior |
||
|
|
O(log(N)+M) |
Retorna membros por intervalo de índice, do maior para o menor |
||
|
|
O(log(N)+M) |
Retorna membros por intervalo de pontuação, do menor para o maior |
||
|
|
O(log(N)+M) |
Retorna membros por intervalo de pontuação, do maior para o menor |
||
|
|
O(log(N)+M) |
Retorna membros por intervalo lexicográfico |
||
|
|
O(log(N)+M) |
Retorna membros por intervalo lexicográfico, em ordem inversa |
||
|
|
O(M\*log(N)) |
Remove membros |
||
|
|
O(log(N)+M) |
Remove membros por intervalo de pontuação |
||
|
|
O(log(N)+M) |
Remove membros por intervalo de classificação |
||
|
|
O(log(N)+M) |
Remove membros por intervalo lexicográfico |
||
|
|
O(1) |
Retorna o número de membros |
||
|
|
O(log(N)) |
Retorna a classificação de um membro, do menor para o maior |
||
|
|
O(log(N)) |
Retorna a classificação de um membro, do maior para o menor |
||
|
|
O(log(N)) |
Conta membros dentro de um intervalo de pontuação |
||
|
|
O(log(N)) |
Conta membros dentro de um intervalo lexicográfico |
||
|
|
O(log(N)) |
Retorna a classificação de uma pontuação, do menor para o maior |
||
|
|
O(log(N)) |
Retorna a classificação de uma pontuação, do maior para o menor |
||
|
|
— |
Exclui uma ou mais chaves do TairZset |
Convenções de sintaxe usadas neste tópico:
UPPERCASE KEYWORD: palavra-chave do comando_italic_: variável[option]: parâmetro opcionalA|B: opções mutuamente exclusivas (escolha uma)...: o parâmetro anterior pode ser repetido
EXZADD
|
Categoria |
Detalhes |
|
|
Sintaxe |
|
XX] [CH] [INCR] score member [score member ...]` |
|
Complexidade |
O(M\*log(N)), onde N é o número de membros na chave e M é o número de membros adicionados ou atualizados |
|
|
Descrição |
Adiciona membros com pontuações a uma chave TairZset ou atualiza pontuações de membros existentes. |
Comportamento:
Se a chave não existir, o sistema a criará.
Caso o membro não exista, o sistema o adicionará com a pontuação fornecida.
Quando o membro já existe, sua pontuação é sobrescrita (a menos que
NXseja especificado).Cada pontuação é uma representação em string de um número de ponto flutuante de precisão dupla. Os valores
+infe-infsão válidos.
Para usar pontuação multidimensional, separe cada dimensão com#, por exemplo111#222#121. Todos os membros na chave devem usar o mesmo número de dimensões.
Opções:
|
Opção |
Descrição |
|
|
Adiciona apenas novos membros; ignora membros existentes |
|
|
Atualiza apenas membros existentes; ignora novos membros |
|
|
Altera o valor de retorno da contagem de membros recém-adicionados para a contagem de todos os membros alterados (adicionados ou com pontuação atualizada) |
|
|
Trata a pontuação como um incremento, fazendo com que |
Valor de retorno:
Sem opções: o número de membros recém-adicionados (membros com apenas atualização de pontuação não são contados)
Com
CH: o número de membros adicionados ou cuja pontuação foi alteradaCom
INCR: a nova pontuação do membro como string (por exemplo,"2#0#6"); retornanilse a operação for ignorada devido aNXouXX
Exemplo:
EXZADD testkey NX 1#0#3 a 1#0#2 b
(integer) 2
EXZINCRBY
|
Categoria |
Detalhes |
|
Sintaxe |
|
|
Complexidade |
O(log(N)) |
|
Descrição |
Incrementa a pontuação de um membro em uma chave TairZset. |
Comportamento:
Se a chave ou o membro não existir, ambos serão criados com a pontuação definida como
increment.Caso o membro exista, sua pontuação será incrementada pelo valor de
increment.Cada dimensão de pontuação é um número de ponto flutuante de precisão dupla. Os valores
+infe-infsão válidos.Para decrementar uma pontuação, passe um valor negativo para
increment.
Para pontuações multidimensionais,incrementdeve usar o mesmo formato da pontuação do membro. Por exemplo, para incrementar apenas a segunda dimensão de uma pontuação de três dimensões, use0#1#0.
Valor de retorno: A nova pontuação do membro como string. Para pontuações multidimensionais, o formato é "score1#score2#..." (por exemplo, "2#0#6").
Exemplo:
EXZINCRBY testkey 2#2#1 a
"3#2#4"
EXZSCORE
|
Categoria |
Detalhes |
|
Sintaxe |
|
|
Complexidade |
O(1) |
|
Descrição |
Retorna a pontuação de um membro em uma chave TairZset. Retorna |
Valor de retorno: A pontuação do membro como string. Para pontuações multidimensionais, o formato é "score1#score2#..." (por exemplo, "3#2#4").
Exemplo:
EXZSCORE testkey a
"3#2#4"
EXZRANGE
|
Categoria |
Detalhes |
|
Sintaxe |
|
|
Complexidade |
O(log(N)+M), onde N é o número de membros e M é a quantidade retornada |
|
Descrição |
Retorna membros dentro de um intervalo de índices, classificados por pontuação do menor para o maior. |
Opções:
|
Opção |
Descrição |
|
|
Valores de índice baseados em zero. |
|
|
Inclui pontuações na resposta. O formato alterna entre membro e pontuação: |
Return value: Uma lista de membros dentro do intervalo especificado, com pontuações se WITHSCORES for especificado.
Exemplo:
EXZRANGE testkey 0 -1 WITHSCORES
1) "b"
2) "1#0#2"
3) "a"
4) "3#2#4"
EXZREVRANGE
|
Categoria |
Detalhes |
|
Sintaxe |
|
|
Complexidade |
O(log(N)+M), onde N é o número de membros e M é a quantidade retornada |
|
Descrição |
Retorna membros dentro de um intervalo de índices, classificados por pontuação do maior para o menor. Membros com a mesma pontuação são classificados em ordem lexicográfica inversa. Funciona como EXZRANGE, exceto pela direção da classificação. |
Opções:
|
Opção |
Descrição |
|
|
Valores de índice baseados em zero. |
|
|
Inclui pontuações na resposta. |
Return value: Uma lista de membros dentro do intervalo especificado, com pontuações se WITHSCORES for especificado.
Exemplo:
EXZREVRANGE testkey 0 -1 WITHSCORES
1) "a"
2) "3#2#4"
3) "b"
4) "1#0#2"
EXZRANGEBYSCORE
|
Categoria |
Detalhes |
|
Sintaxe |
|
|
Complexidade |
O(log(N)+M), onde N é o número de membros e M é a quantidade retornada. Quando M é constante (por exemplo, usando |
|
Descrição |
Retorna todos os membros com pontuações entre |
Opções:
|
Opção |
Descrição |
|
|
Pontuações mínima e máxima. Para pontuações multidimensionais, use |
|
|
Inclui pontuações na resposta. |
|
|
Limita o resultado a |
Return value: Uma lista de membros dentro do intervalo de pontuação, com pontuações se WITHSCORES for especificado.
Exemplo:
EXZRANGEBYSCORE testkey 0#0#0 6#6#6 WITHSCORES
1) "b"
2) "1#0#2"
3) "a"
4) "3#2#4"
EXZREVRANGEBYSCORE
|
Categoria |
Detalhes |
|
Sintaxe |
|
|
Complexidade |
O(log(N)+M), onde N é o número de membros e M é a quantidade retornada. Quando M é constante (por exemplo, usando |
|
Descrição |
Retorna todos os membros com pontuações entre |
Opções:
|
Opção |
Descrição |
|
|
Pontuações máxima e mínima (observe a ordem invertida dos argumentos). Para pontuações multidimensionais, use |
|
|
Inclui pontuações na resposta. |
|
|
Limita o resultado a |
Return value: Uma lista de membros dentro do intervalo de pontuação, com pontuações se WITHSCORES for especificado.
Exemplo:
EXZREVRANGEBYSCORE testkey 6#6#6 0#0#0 WITHSCORES
1) "a"
2) "3#2#4"
3) "b"
4) "1#0#2"
EXZRANGEBYLEX
|
Categoria |
Detalhes |
|
Sintaxe |
|
|
Complexidade |
O(log(N)+M), onde N é o número de membros e M é a quantidade retornada. Quando M é constante, a complexidade é O(log(N)). |
|
Descrição |
Retorna membros cujos nomes estão entre |
Se os membros tiverem pontuações diferentes, o conjunto retornado será indefinido. A comparação lexicográfica usa a função C memcmp() , comparando byte a byte. Se duas strings compartilharem um prefixo comum, a string mais longa terá classificação superior.
Opções:
|
Opção |
Descrição |
|
|
Limites de nomes de membros. Adicione o prefixo |
|
|
Limita o resultado a |
Return value: Uma lista de membros dentro do intervalo lexicográfico.
Exemplo:
EXZRANGEBYLEX zzz [a [b
1) "aba"
2) "abc"
EXZREVRANGEBYLEX
|
Categoria |
Detalhes |
|
Sintaxe |
|
|
Complexidade |
O(log(N)+M), onde N é o número de membros e M é a quantidade retornada. Quando M é constante, a complexidade é O(log(N)). |
|
Descrição |
Retorna membros no intervalo lexicográfico entre |
Opções:
|
Opção |
Descrição |
|
|
Limites de nomes de membros (observe a ordem invertida dos argumentos). Adicione o prefixo |
|
|
Limita o resultado a |
Return value: Uma lista de membros dentro do intervalo lexicográfico, em ordem inversa.
Exemplo:
EXZREVRANGEBYLEX zzz [b [a
1) "abc"
2) "aba"
EXZREM
|
Categoria |
Detalhes |
|
Sintaxe |
|
|
Complexidade |
O(M\*log(N)), onde N é o número de membros e M é a quantidade de membros a serem removidos |
|
Descrição |
Remove os membros especificados de uma chave TairZset. Membros inexistentes são ignorados silenciosamente. Retorna um erro se a chave existir, mas contiver um tipo de dados diferente. |
Valor de retorno: O número de membros removidos (sem contar membros inexistentes).
Exemplo:
EXZREM testkey a
(integer) 1
EXZREMRANGEBYSCORE
|
Categoria |
Detalhes |
|
Sintaxe |
|
|
Complexidade |
O(log(N)+M), onde N é o número de membros e M é a quantidade removida |
|
Descrição |
Remove todos os membros com pontuações entre |
Opções:
|
Opção |
Descrição |
|
|
Limites de pontuação. Para pontuações multidimensionais, use |
Valor de retorno: O número de membros removidos.
Exemplo:
EXZREMRANGEBYSCORE testkey 3#2#4 6#6#6
(integer) 1
EXZREMRANGEBYRANK
|
Categoria |
Detalhes |
|
Sintaxe |
|
|
Complexidade |
O(log(N)+M), onde N é o número de membros e M é a quantidade removida |
|
Descrição |
Remove todos os membros com classificações entre |
Opções:
|
Opção |
Descrição |
|
|
Valores de classificação baseados em zero, onde 0 é o membro com a menor pontuação. Valores negativos contam a partir da maior pontuação: |
Valor de retorno: O número de membros removidos.
Exemplo:
EXZREMRANGEBYRANK testkey 0 1
(integer) 1
EXZREMRANGEBYLEX
|
Categoria |
Detalhes |
|
Sintaxe |
|
|
Complexidade |
O(log(N)+M), onde N é o número de membros e M é a quantidade removida |
|
Descrição |
Remove membros cujos nomes estão entre |
Opções:
|
Opção |
Descrição |
|
|
Limites de nomes de membros. Adicione o prefixo |
Valor de retorno: O número de membros removidos.
Exemplo:
EXZREMRANGEBYLEX testkey [a [b
(integer) 2
EXZCARD
|
Categoria |
Detalhes |
|
Sintaxe |
|
|
Complexidade |
O(1) |
|
Descrição |
Retorna o número de membros em uma chave TairZset. Retorna 0 se a chave não existir. |
Valor de retorno: O número de membros (inteiro).
Exemplo:
EXZCARD testkey
(integer) 2
EXZRANK
|
Categoria |
Detalhes |
|
Sintaxe |
|
|
Complexidade |
O(log(N)) |
|
Descrição |
Retorna a classificação de um membro, atribuindo a posição 0 ao membro com a menor pontuação (ordem crescente). |
Valor de retorno:
A classificação do membro (inteiro) se o membro existir
nilse a chave ou o membro não existir
Exemplo:
EXZRANK testkey b
(integer) 0
EXZREVRANK
|
Categoria |
Detalhes |
|
Sintaxe |
|
|
Complexidade |
O(log(N)) |
|
Descrição |
Retorna a classificação de um membro, atribuindo a posição 0 ao membro com a maior pontuação (ordem decrescente). Funciona como EXZRANK, mas em ordem inversa. |
Valor de retorno:
A classificação do membro (inteiro) se o membro existir
nilse a chave ou o membro não existir
Exemplo:
EXZREVRANK testkey b
(integer) 1
EXZCOUNT
|
Categoria |
Detalhes |
|
Sintaxe |
|
|
Complexidade |
O(log(N)), onde N é o número de membros. O trabalho é proporcional ao número de elementos percorridos no nível de índice, não ao tamanho do intervalo de pontuação. |
|
Descrição |
Retorna o número de membros com pontuações entre |
Opções:
|
Opção |
Descrição |
|
|
Limites de pontuação. Para pontuações multidimensionais, use |
Valor de retorno: O número de membros dentro do intervalo de pontuação (inteiro).
Exemplo:
EXZCOUNT testkey (1#0#2 6#6#6
(integer) 1
EXZLEXCOUNT
|
Categoria |
Detalhes |
|
Sintaxe |
|
|
Complexidade |
O(log(N)), onde N é o número de membros. O trabalho é proporcional ao número de elementos percorridos no nível de índice. |
|
Descrição |
Retorna o número de membros com nomes entre |
Se os membros tiverem pontuações diferentes, o resultado será indefinido. A comparação lexicográfica usa a função C memcmp() . Se duas strings compartilharem um prefixo comum, a string mais longa terá classificação superior.
Opções:
|
Opção |
Descrição |
|
|
Limites de nomes de membros. Adicione o prefixo |
Valor de retorno: O número de membros dentro do intervalo lexicográfico (inteiro).
Exemplo:
EXZLEXCOUNT zzz [a [b
(integer) 2
EXZRANKBYSCORE
|
Categoria |
Detalhes |
|
Sintaxe |
|
|
Complexidade |
O(log(N)) |
|
Descrição |
Retorna a posição que uma determinada pontuação ocuparia na chave, classificada do menor para o maior (posição 0 = menor pontuação). Se a pontuação não existir, retorna sua posição estimada. Caso a pontuação já exista, a posição é calculada como se a nova pontuação fosse inserida antes da existente. |
Valor de retorno: A posição da pontuação especificada (inteiro).
Exemplo:
EXZRANKBYSCORE testkey 2#0#2
(integer) 1
EXZREVRANKBYSCORE
|
Categoria |
Detalhes |
|
Sintaxe |
|
|
Complexidade |
O(log(N)) |
|
Descrição |
Retorna a posição que uma determinada pontuação ocuparia na chave, classificada do maior para o menor (posição 0 = maior pontuação). Se a pontuação não existir, retorna sua posição estimada. Caso a pontuação já exista, a posição é calculada como se a nova pontuação fosse inserida após a existente. |
Valor de retorno: A posição da pontuação especificada (inteiro).
Exemplo:
EXZREVRANKBYSCORE testkey 2#0#2
(integer) 1