Redis ZSCAN

Redis Zscan



Iterar sobre os membros de um conjunto ordenado

Como todos sabem, os conjuntos classificados do Redis são derivados dos conjuntos regulares em que cada membro é ordenado por seu valor de pontuação em ordem crescente. Se dois ou mais membros tiverem o mesmo valor de pontuação, eles serão ordenados por ordem lexicográfica. Normalmente, os membros e as pontuações podem ser recuperados diretamente usando o comando ZRANGE. Quando você tem um grande conjunto ordenado com milhares de membros, o comando ZRANGE pode bloquear o servidor por um longo tempo, como os comandos SMEMBERS e KEYS, o que é uma desvantagem. Portanto, o Redis oferece um comando especial chamado ZSCAN, que é derivado do comando SCAN para iterar sobre os membros de um conjunto classificado. Como o comando ZSCAN é herdado do comando SCAN, quase todos os comportamentos são os mesmos do comando SCAN de uso geral.







Como na figura dada, o comando SCAN é um iterador baseado em cursor. Portanto, são necessárias uma ou mais iterações para fornecer todos os itens de uma coleção do Redis. Como o comando ZSCAN herda do comando pai SCAN, o comportamento é o mesmo. Neste guia, a sintaxe e os casos de uso do comando ZSCAN serão discutidos em detalhes.



O comando ZSCAN

O comando ZSCAN é um iterador baseado em cursor que inicia a iteração com o cursor 0. Depois, em cada iteração, ele retorna zero ou mais membros do conjunto classificado junto com o próximo cursor que deve ser usado como cursor para a chamada de comando a seguir. Se o cursor retornado for 0 após uma ou mais iterações, significa que o processo de varredura terminou. Todos os membros do conjunto ordenado são retornados neste ponto. Esse processo é chamado de iteração completa. Como você pode ver, o comando ZSCAN mantém seu estado apenas usando um cursor que leva a um reconhecimento de estado limitado. Portanto, as desvantagens a seguir estão associadas ao comando ZSCAN.



  • O mesmo elemento pode retornar em várias iterações.
  • Se um membro não estiver presente no início do processo de varredura, há uma probabilidade de não retornar esse membro durante uma iteração completa.

Além disso, não há garantia na contagem dos membros retornados. Em alguns casos, se o conjunto classificado for muito pequeno, todos os membros poderão ser retornados na primeira iteração. Porque o Redis usa um formato especial de codificação compactado de alocação única para manter os membros até que uma contagem máxima de itens seja atingida. O comando ZSCAN só pode retornar um cursor se a estrutura de dados digitalizada for representada como uma tabela de hash.





Sintaxe:
O comando ZSCAN usa quase a mesma sintaxe que o comando SCAN, exceto que ele aceita uma chave de conjunto classificada como o primeiro argumento. A sintaxe do comando com os argumentos permitidos é a seguinte:

Cursor ZSCAN sorted_set_key [ Padrão de CORRESP ] [ COUNT membro_count ]

sorted_set_key : A chave do conjunto ordenado.
Cursor : O valor do cursor começa em 0 e termina em 0 se for uma iteração completa.



Os seguintes argumentos são opcionais:

COMBINE : um padrão para corresponder ao recuperar os elementos em cada iteração. Somente os membros correspondentes são retornados.
CONTAR : o número aproximado de membros a serem retornados em cada iteração.

O conjunto de resultados retornado por iteração contém alguns elementos. A primeira parte é um inteiro sem sinal de 64 bits que representa o cursor a ser passado para a próxima chamada. A próxima parte é uma matriz de membros e pontuações associadas.

Caso de uso 1 – Recuperar todos os membros e suas missões concluídas de um jogo online

Vamos supor que uma empresa de jogos online mantenha uma tabela de classificação usando o conjunto classificado Redis. Como os usuários em massa estão jogando ativamente, eles precisam de uma maneira de recuperar cada jogador e sua pontuação associada, que é o número de missões concluídas. É obrigatório realizar a recuperação sem bloquear o servidor. Assim, a recomendação é utilizar o comando ZSCAN da seguinte forma:

Primeiro, criamos um conjunto ordenado com alguns jogadores e o número de missões concluídas.

zadd Leaderboard 12 Jogador6:João 4 Jogador2: Maria 22 Jogador1: Patel quinze Jogador: onze 23 Jogador5: Ana 30 Jogador 7: Duro 23 Jogador12:abby dois Jogador13:Nicky 6 Jogador9:Jeremy 7 Player45:Kina

Agora, podemos iterar sobre os membros do conjunto classificado da seguinte maneira:

zscan Leaderboard 0

Resultado:

O valor do cursor é 0 no conjunto de resultados retornado, o que significa que todos os membros são retornados no final da primeira iteração. Nesse caso, como o número de membros é pequeno, o Redis representa esses membros usando uma codificação compactada de alocação única. Portanto, até que um tamanho máximo de pacote ou contagem de membros seja atingido, o comando retorna todos os membros do conjunto classificado. Isso é chamado de iteração completa. Porque no final da primeira iteração, recebemos todos os dez membros e suas pontuações. Se tivermos centenas de membros, ela será representada como uma tabela de hash na memória. Portanto, são necessárias várias iterações para retornar todos os membros.

O parâmetro COUNT pode ser usado para limitar o número de membros retornados em uma iteração. Por padrão, esse argumento é definido como 10. Se o conjunto classificado consistir em centenas de membros, ele será representado por uma tabela de hash na memória. Portanto, o número de membros retornados é de cerca de dez por iteração. O valor do argumento COUNT será ignorado se o conjunto classificado for muito pequeno.

Caso de uso 2 – Buscar os jogadores cujo nome começa com a letra “J”

O comando ZSCAN pode ser usado para filtrar os membros retornados com base em uma correspondência de padrão. Nesse caso, o argumento MATCH deve ser especificado.

Vamos usar o mesmo exemplo do caso de uso anterior. O requisito é buscar os jogadores cujo nome comece com a letra “J”. É apenas para implementar o próximo recurso legal relacionado ao jogo. O argumento MATCH pode ser especificado da seguinte forma:

zscan Leaderboard 0 Combine * J *

Isso deve retornar dois membros cujos nomes são Jeremy e John.

Conclusão

Em resumo, o comando ZSCAN é usado para iterar sobre os membros e pontuações de um conjunto classificado Redis. Este comando se comporta da mesma forma que o comando SCAN, exceto que o comando ZSCAN aceita a chave set como o primeiro argumento. Conforme discutido nos casos de uso, o comando ZSCAN pode ser usado de diferentes maneiras, especificando os argumentos MATCH e COUNT onde você pode recuperar os membros e pontuações associadas que correspondem a um padrão específico e limitam a contagem de membros retornada por iteração. No geral, o comando ZSCAN pode ser útil ao recuperar os membros de um conjunto classificado sem bloquear o servidor ou cliente.