I. Scénarios d'utilisation des structures de données Redis

J'ai déjà lu le livre "redisbook" et je connais déjà les fonctions de base de Redis. J'ai commencé à lire le code source de Redis la semaine dernière. L'objectif actuel est de bien comprendre les structures de données de Redis. Comme nous le savons tous, Redis comporte au total 5 structures de données. Quels sont les scénarios d'utilisation de chaque structure de données ?

  • String — chaîne
  • Hash — dictionnaire
  • List — liste
  • Set — ensemble
  • Sorted Set — ensemble trié

Ci-dessous, nous expliquerons brièvement leurs scénarios d'utilisation respectifs :

1. String — chaîne

La structure de données String est un simple type clé-valeur. La valeur peut non seulement être une String, mais aussi un nombre (lorsque le type numérique peut être représenté par un Long, l'encodage est entier ; sinon, elle est stockée dans sdshdr sous forme de chaîne). En utilisant le type String, vous pouvez implémenter entièrement les fonctionnalités actuelles de Memcached avec une meilleure efficacité. Vous pouvez également profiter de la persistance planifiée de Redis (avec le mode RDB ou le mode AOF au choix), des journaux d'opérations, de la réplication et d'autres fonctionnalités. En plus de fournir les mêmes opérations get, set, incr, decr et autres que Memcached, Redis fournit également les opérations suivantes :

  • LEN niushuai: O(1) obtenir la longueur d'une chaîne
  • APPEND niushuai redis: Ajouter du contenu à la chaîne, avec une allocation mémoire intelligente (2x à chaque fois)
  • Définir et obtenir un segment de la chaîne
  • Définir et obtenir un certain bit de la chaîne
  • Définir par lots le contenu d'une série de chaînes
  • Compteur atomique
  • L'utilisation astucieuse de la commande GETSET : définir une nouvelle valeur tout en effaçant l'ancienne, et l'utiliser avec le compteur atomique

2. Hash — dictionnaire

Dans Memcached, nous regroupons souvent certaines informations structurées dans un hashmap, les sérialisons côté client et les stockons sous forme de valeur de chaîne (généralement au format JSON), comme le pseudo, l'âge, le sexe, les points d'un utilisateur, etc. À ce moment-là, lorsque vous devez modifier l'un de ces éléments, vous devez généralement extraire la chaîne (JSON), la désérialiser, modifier la valeur de cet élément, puis la sérialiser à nouveau en chaîne (JSON) et la stocker à nouveau. Le simple fait de modifier un attribut nécessite d'accomplir autant d'opérations, ce qui est certainement très coûteux et ne convient pas aux situations pouvant impliquer des opérations concurrentes (par exemple, deux opérations concurrentes doivent toutes deux modifier les points). La structure Hash de Redis, en revanche, vous permet de modifier uniquement la valeur d'un certain attribut, comme la mise à jour d'un attribut dans une base de données.

  • Stocker, lire et modifier les attributs utilisateur

3. List — liste

List est, franchement, une liste chaînée (Redis implémente List à l'aide d'une liste doublement chaînée). Toute personne ayant appris les structures de données devrait pouvoir comprendre sa structure. Avec la structure List, nous pouvons facilement implémenter des fonctions telles que le classement des derniers messages (par exemple, le TimeLine de Sina Weibo). Une autre application de List est celle de file d'attente de messages : vous pouvez utiliser les opérations *PUSH de List pour stocker des tâches dans une List, puis des threads de travail utilisent les opérations POP pour extraire les tâches en vue de leur exécution. Redis fournit également une API pour opérer sur un segment d'éléments dans une List, afin que vous puissiez directement interroger ou supprimer un segment d'éléments dans la List.

  • TimeLine de Weibo
  • File d'attente de messages

4. Set — ensemble

Un Set est une collection ; le concept de collection est une combinaison d'un ensemble de valeurs non répétées. En utilisant la structure de données Set fournie par Redis, vous pouvez stocker certaines données de type collection. Par exemple, dans une application Weibo, vous pouvez stocker tous les utilisateurs qu'un utilisateur suit dans un Set, et stocker tous ses fans dans un autre Set. Comme Redis, de manière très conviviale, fournit des opérations telles que l'intersection, l'union et la différence pour les ensembles, vous pouvez très facilement implémenter des fonctions telles que les abonnements mutuels, les intérêts communs et les amis de second degré. Pour toutes les opérations d'ensemble ci-dessus, vous pouvez également utiliser différentes commandes pour choisir de renvoyer le résultat au client ou de le stocker dans un nouveau Set.

  • Amis en commun, amis de second degré
  • En utilisant l'unicité, vous pouvez compter toutes les adresses IP uniques qui visitent le site web
  • Lors de la recommandation d'amis, trouvez l'intersection en fonction des tags ; si elle est supérieure à un certain seuil, vous pouvez faire une recommandation

5. Sorted Set — ensemble trié

Comparés aux Sets, les Sorted Sets ajoutent un paramètre de poids, le score, aux éléments d'un Set, de sorte que les éléments de l'ensemble puissent être ordonnés par score. Par exemple, dans un Sorted Set stockant les scores de tous les camarades de classe, sa valeur d'ensemble peut être l'identifiant étudiant, et le score peut être leur note d'examen. Ainsi, lorsqu'une donnée est insérée dans l'ensemble, elle est déjà naturellement triée. De plus, les Sorted Sets peuvent être utilisés comme une file d'attente pondérée. Par exemple, les messages normaux ont un score de 1, et les messages importants ont un score de 2 ; les threads de travail peuvent alors choisir de récupérer les tâches dans l'ordre décroissant du score, ce qui permet d'exécuter les tâches importantes en premier.

  • Éléments avec des poids, comme le classement des scores des utilisateurs d'un jeu
  • Une structure de données relativement complexe, généralement pas utilisée dans trop de scénarios

II. Autres scénarios d'utilisation des fonctionnalités Redis

1. Système de publication-abonnement

Pub/Sub, littéralement compris, consiste à publier (Publish) et à s'abonner (Subscribe). Dans Redis, vous pouvez configurer la publication et l'abonnement de messages pour une certaine clé. Lorsqu'un message est publié sur une clé, tous les clients qui y sont abonnés recevront le message correspondant. L'utilisation la plus évidente de cette fonctionnalité est comme système de messagerie en temps réel, comme la messagerie instantanée ordinaire, les discussions de groupe et d'autres fonctions.

2. Transactions

Qui a dit que NoSQL ne prend pas en charge les transactions ? Bien que les Transactions de Redis ne fournissent pas de transactions ACID strictes (par exemple, si une série de commandes soumises à l'exécution via EXEC provoque un plantage du serveur pendant l'exécution, alors certaines des commandes auront été exécutées et les autres non), les Transactions fournissent toujours la fonction de base consistant à empaqueter des commandes pour exécution (lorsque le serveur ne rencontre pas de problème, elles peuvent garantir qu'une série de commandes sont exécutées séquentiellement ensemble, et qu'aucune commande d'un autre client ne sera insérée entre elles). Redis fournit également une fonctionnalité Watch : vous pouvez surveiller une clé avec Watch puis exécuter des Transactions. Pendant ce processus, si la valeur surveillée est modifiée, les Transactions le détecteront et refuseront de s'exécuter.