Redis ZSCAN

Redis Zscan



Itérer sur les membres d'un ensemble trié

Comme vous le savez tous, les ensembles triés Redis sont dérivés des ensembles réguliers où chaque membre est classé par sa valeur de score dans l'ordre croissant. Si deux membres ou plus détiennent la même valeur de score, ils sont classés par ordre lexicographique. Habituellement, les membres et les scores peuvent être récupérés directement à l'aide de la commande ZRANGE. Lorsque vous avez un grand ensemble trié avec des milliers de membres, la commande ZRANGE peut bloquer le serveur pendant longtemps comme les commandes SMEMBERS et KEYS, ce qui est un inconvénient. Ainsi, Redis propose une commande spéciale appelée ZSCAN qui est dérivée de la commande SCAN pour itérer sur les membres d'un ensemble trié. Étant donné que la commande ZSCAN hérite de la commande SCAN, presque tous les comportements sont identiques à ceux de la commande SCAN à usage général.







Comme dans la figure donnée, la commande SCAN est un itérateur basé sur un curseur. Il faut donc une ou plusieurs itérations pour fournir tous les éléments d'une collection Redis. Comme la commande ZSCAN hérite de la commande SCAN parente, le comportement est le même. Dans ce guide, la syntaxe et les cas d'utilisation de la commande ZSCAN seront discutés en détail.



La commande ZSCAN

La commande ZSCAN est un itérateur basé sur un curseur qui démarre l'itération avec le 0ème curseur. Ensuite, à chaque itération, il renvoie zéro ou plusieurs membres de l'ensemble trié avec le curseur suivant qui doit être utilisé comme curseur pour l'appel de commande suivant. Si le curseur renvoyé est 0 après une ou plusieurs itérations, cela signifie que le processus de numérisation est terminé. Tous les membres de l'ensemble trié sont renvoyés à ce stade. Ce processus est appelé une itération complète. Comme vous avez pu le voir, la commande ZSCAN conserve son état uniquement à l'aide d'un curseur, ce qui conduit à une connaissance limitée de l'état. Par conséquent, les inconvénients suivants sont associés à la commande ZSCAN.



  • Le même élément peut revenir dans plusieurs itérations.
  • Si un membre n'est pas présent au début du processus de balayage, il y a une probabilité de ne pas renvoyer ce membre pendant une itération complète.

De plus, il n'y a aucune garantie sur le décompte des membres élus. Dans certains cas, si l'ensemble trié est très petit, tous les membres peuvent être renvoyés lors de la toute première itération. Parce que Redis utilise un format spécial d'encodage compressé à allocation unique pour conserver les membres jusqu'à ce qu'un nombre maximal d'éléments soit atteint. La commande ZSCAN ne peut renvoyer un curseur que si la structure de données analysée est représentée sous la forme d'une table de hachage.





Syntaxe:
La commande ZSCAN utilise presque la même syntaxe que la commande SCAN sauf qu'elle accepte une clé d'ensemble triée comme premier argument. La syntaxe de la commande avec les arguments autorisés est la suivante :

ZSCAN sorted_set_key curseur [ MATCH motif ] [ COUNT nombre_de_membres ]

sort_set_key : La clé de l'ensemble trié.
Le curseur : La valeur du curseur commence à 0 et se termine à 0 s'il s'agit d'une itération complète.



Les arguments suivants sont facultatifs :

MATCH : Un modèle à faire correspondre lors de la récupération des éléments à chaque itération. Seuls les membres correspondants sont renvoyés.
COMPTER : Le nombre approximatif de membres à renvoyer dans chaque itération.

Le jeu de résultats renvoyé par itération contient quelques éléments. La première partie est un entier non signé 64 bits qui représente le curseur à transmettre au prochain appel. La partie suivante est un tableau des membres et des scores associés.

Cas d'utilisation 1 - Récupérer tous les membres et leurs missions terminées d'un jeu en ligne

Supposons qu'une société de jeux en ligne gère un classement en utilisant l'ensemble trié Redis. Étant donné que de nombreux utilisateurs jouent activement au jeu, ils ont besoin d'un moyen de récupérer chaque joueur et son score associé, c'est-à-dire le nombre de missions terminées. Il est indispensable d'effectuer la récupération sans bloquer le serveur. Ainsi, la recommandation est d'utiliser la commande ZSCAN comme suit :

Tout d'abord, nous créons un ensemble trié avec quelques joueurs et le nombre de missions terminées.

zadd Classement 12 Joueur 6 : John 4 Joueur2 : Marie 22 Joueur 1 : Patel quinze Joueur: Onze 23 Joueur5 : Ann 30 Player7 : Dur 23 Joueur12 : abby deux Joueur13 :Nicky 6 Joueur9 : Jérémy sept Joueur45:Kina

Maintenant, nous pouvons parcourir les membres de l'ensemble trié comme suit :

Classement zscan 0

Production:

La valeur du curseur est 0 dans le jeu de résultats renvoyé, ce qui signifie que tous les membres sont renvoyés à la fin de la première itération. Dans ce cas, étant donné que le nombre de membres est faible, Redis représente ces membres à l'aide d'un encodage compact à allocation unique. Par conséquent, jusqu'à ce qu'une taille de pack ou un nombre de membres maximum soit atteint, la commande renvoie tous les membres du jeu trié. C'est ce qu'on appelle une itération complète. Car à la fin de la première itération, nous recevons les dix membres et leurs scores. Si nous avons des centaines de membres, il est représenté comme une table de hachage en mémoire. Il faut donc plusieurs itérations pour retourner tous les membres.

Le paramètre COUNT peut être utilisé pour limiter le nombre de membres renvoyés dans une itération. Par défaut, cet argument vaut 10. Si l'ensemble trié se compose de centaines de membres, il est représenté par une table de hachage dans la mémoire. Ainsi, le nombre de membres retournés est d'environ dix par itération. La valeur de l'argument COUNT est ignorée si l'ensemble trié est trop petit.

Cas d'utilisation 2 - Récupérer les joueurs dont le nom commence par la lettre 'J'

La commande ZSCAN peut être utilisée pour filtrer les membres renvoyés en fonction d'une correspondance de modèle. Dans ce cas, l'argument MATCH doit être spécifié.

Prenons le même exemple du cas d'utilisation précédent. L'exigence est d'aller chercher les joueurs dont le nom commence par la lettre 'J'. C'est juste pour implémenter la prochaine fonctionnalité intéressante liée au jeu. L'argument MATCH peut être spécifié comme suit :

Classement zscan 0 match * J *

Cela devrait idéalement renvoyer deux membres dont les noms sont Jeremy et John.

Conclusion

En résumé, la commande ZSCAN est utilisée pour parcourir les membres et les scores d'un ensemble trié Redis. Cette commande se comporte de la même manière que la commande SCAN, sauf que la commande ZSCAN accepte la clé définie comme premier argument. Comme indiqué dans les cas d'utilisation, la commande ZSCAN peut être utilisée de différentes manières en spécifiant les arguments MATCH et COUNT où vous pouvez récupérer les membres et les scores associés qui correspondent à un modèle spécifique et limiter le nombre de membres renvoyés par itération. Dans l'ensemble, la commande ZSCAN peut être utile lors de la récupération des membres d'un ensemble trié sans bloquer le serveur ou le client.