One place for hosting & domains

      Comment gérer les sets triés dans Redis


      Introduction

      Redis est un magasin open source de données clé-valeur en mémoire. Dans Redis, les sets triés sont un type de données semblable aux sets, en ce sens qu’ils sont tous deux des groupes de chaînes non répétitifs. La différence est que chaque membre d’un set trié est associé à un score, ce qui permet de les trier du plus petit score au plus grand. Comme pour les sets, chaque membre d’un set trié doit être unique, même si plusieurs membres peuvent partager le même score.

      Ce tutoriel explique comment créer des sets triés, récupérer et supprimer leurs membres, et créer de nouveaux sets triés à partir de ceux qui existent déjà.

      Ce guide est rédigé sous la forme d’une fiche avec des exemples autonomes. Nous vous encourageons à passer directement à la section qui correspond à la tâche que vous essayez d’accomplir.

      Les commandes présentées dans ce guide ont été testées sur un serveur Ubuntu 18.04 exécutant la version 4.0.9 de Redis. Pour mettre en place un environnement similaire, vous pouvez suivre l’étape 1 de notre guide Comment installer et sécuriser Redis sur Ubuntu 18.04. Nous montrerons comment ces commandes se comportent en les exécutant avec redis-cli, l’interface en ligne de commande Redis. Notez que si vous utilisez une autre interface Redis, Redli par exemple, la sortie exacte de certaines commandes peut différer.

      Vous pouvez également provisionner une instance de base de données Redis gérée pour tester ces commandes, mais notez que selon le niveau de contrôle autorisé par votre fournisseur de base de données, certaines commandes de ce guide peuvent ne pas fonctionner comme décrit. Pour provisionner une base de données gérée DigitalOcean, suivez la documentation de notre produit Managed Databases. Ensuite, vous devez soit installer Redli, soit mettre en place un tunnel TLS afin de vous connecter à la base de données gérée via TLS.

      Création de sets triés et ajout de membres

      Pour créer un set trié, utilisez la commande zadd. zadd accepte comme arguments le nom de la clé qui contiendra le set trié, suivi du score du membre que vous ajoutez et de la valeur du membre lui-même. La commande suivante va créer une clé de set trié appelée faveGuitarists avec un membre, "Joe Pass", qui a un score de 1 :

      • zadd faveGuitarists 1 "Joe Pass"

      zadd renverra un entier indiquant combien de membres ont été ajoutés au set trié s’il a été créé avec succès.

      Output

      (integer) 1

      Vous pouvez ajouter plus d’un membre à un set trié avec zadd. Notez que leurs scores n’ont pas besoin d’être séquentiels, il peut y avoir des écarts entre les scores, et plusieurs membres détenus dans un même set trié peuvent partager le même score :

      • zadd faveGuitarists 4 "Stephen Malkmus" 2 "Rosetta Tharpe" 3 "Bola Sete" 3 "Doug Martsch" 8 "Elizabeth Cotten" 12 "Nancy Wilson" 4 "Memphis Minnie" 12 "Michael Houser"

      Output

      (integer) 8

      zadd peut accepter les options suivantes, que vous devez saisir après le nom de la clé et avant le premier score de membre :

      • NX ou XX : ces options ont des effets opposés, de sorte que vous ne pouvez en inclure qu’une seule dans toute opération zadd :
        • NX : dit à zadd de ne pas mettre à jour les membres existants. Avec cette option, zadd ne fera qu’ajouter de nouveaux éléments.
        • XX : dit à zadd de seulement mettre à jour les éléments existants. Avec cette option, zadd n’ajoutera jamais de nouveaux membres.
      • CH : normalement, zadd ne renvoie que le nombre de nouveaux éléments ajoutés au set trié. Cependant, si cette option est incluse, zadd renvoie le nombre d’éléments modifiés. Cela inclut les membres nouvellement ajoutés et les membres dont les scores ont été modifiés.
      • INCR : avec cette option, la commande incrémente la valeur du score du membre. Si le membre n’existe pas encore, la commande l’ajoutera au set trié avec l’incrément comme score, comme si son score initial était de 0. Avec INCR inclus, zadd retournera le nouveau score du membre si la commande est réussie. Notez que vous ne pouvez inclure qu’une seule paire score/membre à la fois lorsque vous utilisez cette option.

      Au lieu de passer l’option INCR à zadd, vous pouvez utiliser la commande zincrby qui se comporte exactement de la même manière. Au lieu de donner au membre du set trié la valeur indiquée par la valeur du score comme zadd, elle incrémente le score de ce membre de cette valeur. Par exemple, la commande suivante augmente de 5 le score du membre "Stephen Malkmus", qui passe alors de 4 à 9.

      • zincrby faveGuitarists 5 "Stephen Malkmus"

      Output

      "9"

      Comme c’est le cas avec l’option INCR de la commande zadd, si le membre spécifié n’existe pas, zincrby le créera avec la valeur d’incrément comme score.

      La façon la plus simple de récupérer les membres détenus dans un set trié est d’utiliser la commande zrange. Cette commande accepte comme arguments le nom de la clé dont vous voulez récupérer les membres et une série de membres détenus en son sein. La plage est définie par deux nombres qui représentent des indices basés sur zéro, ce qui signifie que 0 représente le premier membre du set trié (ou le membre ayant le score le plus bas), 1 représente le suivant, et ainsi de suite.

      L’exemple suivant renvoie les quatre premiers membres du set trié faveGuitarists créé dans la section précédente :

      • zrange faveGuitarists 0 3

      Output

      1) "Joe Pass" 2) "Rosetta Tharpe" 3) "Bola Sete" 4) "Doug Martsch"

      Notez que si le set trié que vous passez à zrange comporte deux éléments ou plus qui partagent le même score, il triera ces éléments dans l’ordre lexicographique, ou alphabétique.

      Les indices de départ et d’arrêt peuvent également être des nombres négatifs, avec -1 représentant le dernier membre, -2 l’avant-dernier, etc. :

      • zrange faveGuitarists -5 -2

      Output

      1) "Memphis Minnie" 2) "Elizabeth Cotten" 3) "Stephen Malkmus" 4) "Michael Houser"

      zrange peut accepter l’argument WITHSCORES qui, une fois inclus, rendra également les scores des membres :

      • zrange faveGuitarists 5 6 WITHSCORES

      Output

      1) "Elizabeth Cotten" 2) "8" 3) "Stephen Malkmus" 4) "9"

      zrange ne peut renvoyer une série de membres que dans l’ordre numérique croissant. Pour inverser cela et renvoyer une plage par ordre décroissant, vous devez utiliser la commande zrevrange. Considérez cette commande comme une inversion temporaire de l’ordre du set trié donné avant de renvoyer les membres qui se trouvent dans la plage spécifiée. Ainsi, avec zrevrange, 0 représentera le dernier membre détenu dans la clé, 1 représentera l’avant-dernier, et ainsi de suite :

      • zrevrange faveGuitarists 0 5

      Output

      1) "Nancy Wilson" 2) "Michael Houser" 3) "Stephen Malkmus" 4) "Elizabeth Cotten" 5) "Memphis Minnie" 6) "Doug Martsch"

      zrevrange peut également accepter l’option WITHSCORES.

      Vous pouvez renvoyer une série de membres en fonction de leurs scores avec la commande zrangebyscore. Dans l’exemple suivant, la commande renverra tout membre détenu dans la clé faveGuitarists avec un score de 2, 3 ou 4 :

      • zrangebyscore faveGuitarists 2 4

      Output

      1) "Rosetta Tharpe" 2) "Bola Sete" 3) "Doug Martsch" 4) "Memphis Minnie"

      Dans cet exemple, la fourchette est inclusive, ce qui signifie qu’elle renvoie les membres ayant un score de 2 ou 4. Vous pouvez exclure l’une ou l’autre des extrémités de la plage en la faisant précéder d’une parenthèse ouverte ((). Dans l’exemple suivant, la commande renverra chaque membre dont le score est supérieur ou égal à 2, mais inférieur à 4 :

      • zrangebyscore faveGuitarists 2 (4

      Output

      1) "Rosetta Tharpe" 2) "Bola Sete" 3) "Doug Martsch"

      Comme pour zrange, zrangebyscore peut accepter l’argument WITHSCORES. La commande accepte également l’option LIMIT, que vous pouvez utiliser pour ne récupérer qu’une sélection d’éléments de la sortie zrangebyscore. Cette option accepte un décalage, qui marque le premier membre de la plage que la commande retournera, et un comptage, qui définit combien de membres la commande retournera au total. Par exemple, la commande suivante examinera les six premiers membres du set trié faveGuitarists mais n’en renverra que trois, à partir du deuxième membre du set, représenté par 1 :

      • zrangebyscore faveGuitarists 0 5 LIMIT 1 3

      Output

      1) "Rosetta Tharpe" 2) "Bola Sete" 3) "Doug Martsch"

      La commande zrevrangebyscore renvoie une plage inversée de membres en fonction de leurs scores. La commande suivante renvoie chaque membre du set avec un score compris entre 10 et 6 :

      • zrevrangebyscore faveGuitarists 10 6

      Output

      1) "Stephen Malkmus" 2) "Elizabeth Cotten"

      Comme pour zrangebyscore, zrevrangebyscore peut accepter à la fois les options WITHSCORES et LIMIT. De plus, vous pouvez exclure l’une ou l’autre extrémité de la plage en la faisant précéder d’une parenthèse ouverte.

      Il peut arriver que tous les membres d’un set trié aient le même score. Dans ce cas, vous pouvez forcer redis à renvoyer une série d’éléments triés lexicographiquement, ou par ordre alphabétique, avec la commande zrangebylex. Pour essayer cette commande, lancez la commande zadd suivante pour créer un set trié où chaque membre a le même score :

      • zadd SomervilleSquares 0 Davis 0 Inman 0 Union 0 porter 0 magoun 0 ball 0 assembly

      zrangebylex doit être suivi du nom d’une clé, d’un intervalle de démarrage et d’un intervalle d’arrêt. Les intervalles de démarrage et d’arrêt doivent commencer par une parenthèse ouverte (() ou une accolade ouverte ([), comme ceci :

      • zrangebylex SomervilleSquares [a [z

      Output

      1) "assembly" 2) "ball" 3) "magoun" 4) "porter"

      Notez que cet exemple n’a renvoyé que quatre des huit membres du set, même si la commande recherchait une plage de a à z. Cela s’explique par le fait que les valeurs Redis sont sensibles à la casse, de sorte que les membres qui commencent par des lettres majuscules ont été exclus de sa sortie. Pour les restituer, vous pouvez procéder comme suit :

      • zrangebylex SomervilleSquares [A [z

      Output

      1) "Davis" 2) "Inman" 3) "Union" 4) "assembly" 5) "ball" 6) "magoun" 7) "porter"

      zrangebylex accepte également les caractères spéciaux -, qui représente l’infini négatif, et +, qui représente l’infini positif. Ainsi, la syntaxe de commande suivante renverra également chaque membre du set trié :

      • zrangebylex SomervilleSquares - +

      Notez que zrangebylex ne peut pas renvoyer les membres d’un set trié dans l’ordre lexicographique inverse (ordre alphabétique croissant). Pour ce faire, utilisez zrevrangebylex :

      • zrevrangebylex SomervilleSquares + -

      Output

      1) "porter" 2) "magoun" 3) "ball" 4) "assembly" 5) "Union" 6) "Inman" 7) "Davis"

      Comme cette commande est destinée à l’utilisation avec les sets triés où chaque membre a le même score, zrangebylex n’accepte pas l’option WITHSCORES. Elle accepte toutefois l’option LIMIT.

      Pour savoir combien de membres se trouvent dans un set trié donné (ou, en d’autres termes, pour déterminer sa cardinalité), utilisez la commande zcard. L’exemple suivant montre combien de membres sont détenus dans la clé faveGuitarists de la première section de ce guide :

      Output

      (integer) 9

      zcount peut vous dire combien d’éléments conservés dans un set trié se situent dans une plage de scores. Le premier chiffre qui suit la clé est le début de la plage et le second est la fin de la plage :

      • zcount faveGuitarists 3 8

      Output

      (integer) 4

      zscore renvoie le score d’un membre spécifique d’un set trié :

      • zscore faveGuitarists "Bola Sete"

      Output

      "3"

      Si la clé ou le membre spécifié n’existe pas, zscore retournera (nil).

      zrank est semblable à zscore, mais au lieu de renvoyer le score du membre donné, il renvoie son rang. Dans Redis, un rang est un indice basé sur zéro des membres d’un set trié, ordonné par leur score. Par exemple, "Joe Pass" a un score de 1, mais comme c’est le score le plus bas de tous les membres de la clé, il a un rang de 0 :

      • zrank faveGuitarists "Joe Pass"

      Output

      (integer) 0

      Il existe une autre commande Redis appelé zrevrank qui remplit la même fonction que zrank, mais qui inverse les rangs des membres du set. Dans l’exemple suivant, le membre "Joe Pass" a le score le plus bas, et par conséquent le rang inversé le plus élevé :

      • zrevrank faveGuitarists "Joe Pass"

      Output

      (integer) 8

      La seule relation entre le score d’un membre et son rang est la position de son score par rapport à ceux des autres membres. S’il y a un écart de score entre deux membres successifs, cela ne se reflétera pas dans leur rang. Notez que si deux membres ont le même score, celui qui vient en premier dans l’ordre alphabétique aura le rang le plus bas.

      Comme zscore, zrank et zrevrank retourneront (nil) si la clé ou le membre n’existe pas.

      zlexcount peut vous dire combien de membres d’un set trié sont contenus dans une plage lexicographique. L’exemple suivant utilise le set trié SomervilleSquares de la section précédente :

      • zlexcount SomervilleSquares [M [t

      Output

      (integer) 5

      Cette commande suit la même syntaxe que la commande zrangebylex, reportez-vous donc à la section précédente pour savoir comment définir une plage de chaînes.

      Suppression de membres des sets triés

      La commande zrem permet de supprimer un ou plusieurs membres d’un set trié :

      • zrem faveGuitarists "Doug Martsch" "Bola Sete"

      zrem renverra un nombre entier indiquant combien de membres ont été retirés du set trié :

      Output

      (integer) 2

      Il existe trois commandes Redis qui vous permettent de supprimer les membres d’un set trié en fonction d’une plage. Par exemple, si chaque membre d’un set trié a le même score, vous pouvez supprimer des membres sur la base d’une plage lexicographique avec zremrangebylex. Cette commande utilise la même syntaxe que zrangebylex. L’exemple suivant permet de supprimer tout membre commençant par une majuscule de la clé SomervilleSquares créée dans la section précédente :

      • zremrangebylex SomervilleSquares [A [Z

      La commande zremrangebylex affichera un nombre entier indiquant le nombre de membres qu’elle a retirés :

      Output

      (integer) 3

      Vous pouvez également supprimer des membres sur la base d’une plage de scores avec la commande zremrangebyscore, qui utilise la même syntaxe que la commande zrangebyscore. L’exemple suivant permettra de supprimer tout membre détenu dans faveGuitarists avec un score de 4, 5 ou 6 :

      • zremrangebyscore faveGuitarists 4 6

      Output

      (integer) 1

      Vous pouvez retirer des membres d’un set basé sur une plage de rangs avec la commande zremrangebyrank, qui utilise la même syntaxe que zrangebyrank. La commande suivante supprimera les trois membres du set trié ayant les rangs les plus bas, qui sont définis par une série d’indices basés sur zéro :

      • zremrangebyrank faveGuitarists 0 2

      Output

      (integer) 3

      Notez que les chiffres transmis à remrangebyrank peuvent également être négatifs, avec -1 représentant le rang le plus élevé, -2 le rang suivant, et ainsi de suite.

      Création de nouveaux sets triés à partir de sets existants

      Redis comprend deux commandes qui vous permettent de comparer les membres de plusieurs sets triés et d’en créer de nouveaux sur la base de ces comparaisons : zinterstore et zunionstore. Pour expérimenter ces commandes, exécutez les commandes zadd suivantes pour créer des exemples de sets triés.

      • zadd NewKids 1 "Jonathan" 2 "Jordan" 3 "Joey" 4 "Donnie" 5 "Danny"
      • zadd Nsync 1 "Justin" 2 "Chris" 3 "Joey" 4 "Lance" 5 "JC"

      zinterstore trouve les membres partagés par deux ou plusieurs sets triés (leur intersection) et produit un nouveau set trié contenant uniquement ces membres. Cette commande doit inclure, dans l’ordre, le nom d’une clé de destination où les membres croisés seront stockés en tant que set trié, le nombre de clés transmises à zinterstore, et les noms des clés que vous voulez analyser :

      • zinterstore BoyBands 2 NewKids Nsync

      zinterstore renvoie un nombre entier indiquant le nombre d’éléments stockés dans le set trié de destination. Comme NewKids et Nsync ne partagent qu’un seul membre, "Joey", la commande renverra 1 :

      Output

      (integer) 1

      Sachez que si la clé de destination existe déjà, zinterstore écrasera son contenu.

      zunionstore va créer un nouveau set trié contenant tous les membres des clés qui lui ont été transmises. Cette commande utilise la même syntaxe que zinterstore, et nécessite le nom d’une clé de destination, le nombre de clés transmises à la commande et les noms des clés :

      • zunionstore SuperGroup 2 NewKids Nsync

      Comme zinterstore, zunionstore renvoie un nombre entier indiquant le nombre d’éléments stockés dans la clé de destination. Même si les deux sets triés originaux contenaient chacun cinq membres, puisque les sets triés ne peuvent pas avoir de membres répétés et que chaque clé a un membre nommé "Joey", l’entier résultant sera 9 :

      Output

      (integer) 9

      Comme zinterstore, zunionstore écrasera le contenu de la clé de destination si elle existe déjà.

      Pour vous donner plus de contrôle sur les scores des membres lors de la création de nouveaux sets triés avec zinterstore et zunionstore, ces deux commandes acceptent les options WEIGHTS et AGGREGATE.

      L’option WEIGHTS est suivie d’un chiffre pour chaque set trié inclus dans la commande qui pondère, ou multiplie, les scores de chaque membre. Le premier chiffre après l’option WEIGHTS pondère les scores de la première clé passée à la commande, le deuxième chiffre pondère la deuxième clé, et ainsi de suite.

      L’exemple suivant crée un nouveau set trié contenant les clés croisées des sets triés NewKids et Nsync. Il pondère les scores dans la clé NewKids par un facteur de trois, et pondère ceux dans la clé Nsync par un facteur de sept :

      • zinterstore BoyBandsWeighted 2 NewKids Nsync WEIGHTS 3 7

      Si l’option WEIGHTS n’est pas incluse, la pondération est par défaut de 1 pour zinterstore et zunionstore.

      AGGREGATE accepte trois sous-options. La première d’entre elles, SUM, implémente le comportement par défaut de zinterstore et zunionstore en ajoutant les scores des membres correspondants dans les sets combinés.

      Si vous exécutez une opération zinterstore ou zunionstore sur deux sets triés qui partagent un membre, mais que ce membre a un score différent dans chaque set, vous pouvez forcer l’opération à attribuer le plus bas des deux scores dans le nouveau set avec la sous-option MIN.

      • zinterstore BoyBandsWeightedMin 2 NewKids Nsync WEIGHTS 3 7 AGGREGATE MIN

      Comme les deux sets triés n’ont qu’un seul membre correspondant avec le même score (3), cette commande va créer un nouveau set avec un membre qui a le plus bas des deux scores pondérés :

      • zscore BoyBandsWeightedMin "Joey"

      Output

      "9"

      De même, AGGREGATE peut forcer zinterstore ou zunionstore à attribuer le score le plus élevé des deux avec l’option MAX :

      • zinterstore BoyBandsWeightedMax 2 NewKids Nsync WEIGHTS 3 7 AGGREGATE MAX

      Cette commande crée un nouveau set avec un membre, "Joey", qui a le plus haut des deux scores pondérés :

      • zscore BoyBandsWeightedMax "Joey"

      Output

      "21"

      Il peut être utile de considérer WEIGHTS comme un moyen de manipuler temporairement les scores des membres avant qu’ils ne soient analysés. De même, il est utile de considérer l’option AGGREGATE comme un moyen de décider comment contrôler les scores des membres avant qu’ils ne soient ajoutés à leurs nouveaux sets.

      Conclusion

      Ce guide détaille un certain nombre de commandes utilisées pour créer et gérer des sets triés dans Redis. S’il y a d’autres commandes, arguments ou procédures connexes que vous aimeriez voir décrits dans ce guide, n’hésitez pas à faire des suggestions dans les commentaires ci-dessous.

      Pour plus d’informations sur les commandes Redis, consultez notre série de tutoriels Comment gérer une base de données Redis.



      Source link