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 commandé par sa valeur de score dans l'ordre croissant. Si deux membres ou plus ont la même valeur de score, ils sont ordonnés par ordre lexicographique. Habituellement, les membres et les scores peuvent être directement récupérés à 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 and Keys qui est un inconvénient. Ainsi, Redis propose une commande spéciale appelée ZSCAN qui est dérivée de la commande de 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 les mêmes que la commande générale à usage.

Comme dans la figure donnée, la commande de scan est un itérateur basé sur le curseur. Par conséquent, il faut une ou plusieurs itérations pour fournir tous les éléments d'une collection Redis. Puisque la commande ZSCAN hérite de la commande Parent Scan, 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 le curseur qui démarre l'itération avec le 0ème curseur. Par la suite, dans chaque itération, il renvoie zéro ou plus de membres triés avec le curseur suivant qui devrait être utilisé comme curseur pour l'appel de commande suivant. Si le curseur retourné est 0 après une ou plusieurs itérations, cela signifie que le processus de balayage est terminé. Tous les membres de l'ensemble triés sont retournés à ce stade. Ce processus est appelé une itération complète. Comme vous pouvez le voir, la commande ZSCAN ne garde son état qu'à utiliser un curseur qui conduit à une conscience 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 en itérations multiples.
  • Si un membre n'est pas présent au début du processus de numérisation, il y a une probabilité de ne pas retourner ce membre lors d'une itération complète.

De plus, il n'y a aucune garantie sur le décompte des membres retournés. Dans certains cas, si l'ensemble trié est très petit, tous les membres peuvent être retournés dans la toute première itération. Parce que Redis utilise un format de codage spécial à allocation unique pour maintenir les membres jusqu'à ce qu'un nombre maximum d'articles soit atteint. La commande ZSCAN n'est en mesure de renvoyer un curseur que si la structure de données numérisée est représentée comme une table de hachage.

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

ZSCAN TROD_SET_KEY Cursor [Match Pattern] [Count Member_Count]

trié_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:

CORRESPONDRE: Un modèle à correspondre lors de la récupération des éléments dans chaque itération. Seuls les membres appariés sont retournés.
COMPTER: Le nombre approximatif de membres à retourner dans chaque itération.

Le résultat retourné par itération contient quelques éléments. La première partie est un entier non signé 64 bits qui représente le curseur à passer dans l'appel suivant. La partie suivante est un éventail de membres et des scores associés.

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

Supposons qu'une entreprise de jeux en ligne maintient un classement en utilisant l'ensemble trié Redis. Étant donné que les utilisateurs massifs jouent activement au jeu, ils ont besoin d'un moyen de récupérer chaque joueur et leur score associé qui est 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 certains joueurs et le nombre terminé de missions.

ZADD CADIFICE 12 Player6: John 4 Player2: Mary 22 Player1: Patel 15 Joueur: 11 23 Player5: Ann 30 Player7: Harsh 23 Player12: Abby 2 Player13: Nicky 6 Player9: Jeremy 7 Player45: Kina

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

classe ZSCAN 0

Sortir:

La valeur du curseur est de 0 dans l'ensemble de résultats renvoyé, ce qui signifie que tous les membres sont retournés à la fin de la première itération. Dans ce cas, comme le nombre de membres est petit, Redis représente ces membres en utilisant un codage emballé à une seule allocation. Par conséquent, jusqu'à ce qu'une taille maximale de pack ou un nombre de membres soit atteint, la commande renvoie tous les membres dans l'ensemble trié. C'est ce qu'on appelle une itération complète. Parce qu'à 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. Donc, il faut plusieurs itérations pour retourner tous les membres.

Le paramètre de nombre peut être utilisé pour limiter le nombre de membres retournés dans une itération. Par défaut, cet argument est défini sur 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 du comte est ignorée si l'ensemble trié est trop petit.

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

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

Utilisons le même exemple à partir du cas d'utilisation précédente. L'exigence est de récupérer les joueurs dont le nom commence par la lettre «J». C'est juste pour implémenter la prochaine fonctionnalité sympa liée au jeu. L'argument de correspondance peut être spécifié comme suit:

Leader ZSCAN 0 Match * J *

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

Conclusion

En résumé, la commande ZSCAN est utilisée pour itérer 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 touche définie comme le premier argument. Comme discuté dans les cas d'utilisation, la commande ZSCAN peut être utilisée de différentes manières en spécifiant les arguments de correspondance et de comptage où vous pouvez récupérer les membres et les scores associés qui correspondent à un modèle spécifique et limitent le nombre de membres retourné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.