Redis ZScan

Redis ZScan

Itera sobre os membros de um conjunto classificado

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

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

O comando do ZScan

O comando do ZScan é um iterador baseado em cursor que inicia a iteração com o 0º cursor. Posteriormente, em cada iteração, ele retorna zero ou mais membros do conjunto classificado, juntamente com o próximo cursor que deve ser usado como cursor para a seguinte chamada de comando. Se o cursor retornado for 0 após uma ou mais iterações, significa que o processo de varredura acabou. Todos os membros do conjunto classificado são devolvidos neste momento. Este processo é chamado de iteração completa. Como você pode ver, o comando do ZScan mantém seu estado apenas usando um cursor que leva a uma consciência do estado limitada. Portanto, as seguintes desvantagens estão associadas ao comando do ZScan.

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

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

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

ZScan Streed_set_key Cursor [Match Pattern] [Count Member_Count]

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

Os seguintes argumentos são opcionais:

CORRESPONDER: Um padrão a ser combinado ao recuperar os elementos em cada iteração. Somente os membros correspondentes são devolvidos.
CONTAR: O número aproximado de membros a serem devolvidos em cada iteração.

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

Use Caso 1 - Recupere todos os membros e suas missões completas de um jogo online

Vamos supor que uma empresa de jogos on -line mantém uma tabela de classificação usando o conjunto Redis classificado. Como usuários massivos estão jogando ativamente o jogo, eles precisam de uma maneira de recuperar cada jogador e sua pontuação associada, que é o número de missões concluídas. É essencial para executar a recuperação sem bloquear o servidor. Portanto, a recomendação é usar o comando do ZScan, da seguinte forma:

Primeiro, criamos um conjunto classificado com alguns jogadores e o número completo de missões.

tabela de classificação Zadd 12 jogador6: John 4 jogador2: Mary 22 jogador1: Patel 15 jogador: 11 23 Player5: Ann 30 Player7: Harsh 23 Player12: Abby 2 Player13: Nicky 6 Player9: Jeremy 7 Player45: Kina

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

Robeira de liderança do ZScan 0

Saída:

O valor do cursor é 0 no conjunto de resultados retornados, o que significa que todos os membros são devolvidos no final da primeira iteração. Nesse caso, como o número de membros é pequeno, Redis representa esses membros usando uma codificação embalada de alocação única. Portanto, até que um tamanho máximo de pacote ou contagem de membros seja alcançado, o comando retorna todos os membros no 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, é representado como uma tabela de hash na memória. Então, são necessárias várias iterações para devolver todos os membros.

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

Use Caso 2 - busque 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 da partida deve ser especificado.

Vamos usar o mesmo exemplo do caso de uso anterior. O requisito é buscar os jogadores cujo nome começa com a letra "J". É apenas para implementar o próximo recurso legal relacionado ao jogo. O argumento da correspondência pode ser especificado da seguinte maneira:

tabela de classificação do ZScan 0 Match *J *

Idealmente, isso deve devolver dois membros cujos nomes são Jeremy e John.

Conclusão

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