Maison  >  Article  >  base de données  >  Types de données Redis et scénarios d'application

Types de données Redis et scénarios d'application

angryTom
angryTomoriginal
2020-02-13 13:23:368270parcourir

Types de données Redis et scénarios d'application

Types de données Redis et scénarios d'application

Redis prend en charge 5 types de données : chaîne (chaîne), hachage (hash), liste (liste) , set (set) et zset (ensemble trié : ensemble ordonné).

1. chaîne

Introduction : le type de données Chaînes est le type de valeur-clé le plus couramment utilisé et le plus simple, et le stockage clé/valeur ordinaire peut être classé dans cette catégorie. . la valeur peut être non seulement une chaîne, mais aussi un nombre. Parce qu'il est binaire, vous pouvez stocker le contenu d'un fichier image sous forme de chaîne. La chaîne de Redis peut pleinement réaliser les fonctions actuelles de memcached et est plus efficace. En plus de fournir les mêmes opérations get, set, incr, decr et autres que Memcached, Redis fournit également les opérations supplémentaires suivantes :

1 Obtenez la longueur de la chaîne

2. au contenu de la chaîne

3. Définir et obtenir un certain contenu de la chaîne

4 Définir et obtenir un certain morceau de la chaîne

5. batches Contenu de la chaîne

Commandes communes : set, get, decr, incr, mget, etc.

Scénarios d'application :

1. Tous les scénarios où Memcached et CKV sont appliqués. Les chaînes et les nombres sont accessibles directement. Les données structurées doivent d'abord être sérialisées, puis définies sur une valeur. En conséquence, la désérialisation est requise après avoir obtenu la valeur.

2. Vous pouvez utiliser les instructions INCR, INCRBY, DECR, DECRBY et d'autres instructions de redis pour obtenir l'effet du comptage atomique. Autrement dit, il peut être utilisé pour répondre aux exigences de comptage statistique des entreprises. Il peut également être utilisé pour implémenter idmaker, qui génère des identifiants uniques au monde.

3. Stockez la clé de session pour implémenter un système de session distribué. La clé Redis peut facilement définir le délai d'expiration, qui est utilisé pour réaliser l'expiration automatique de la clé de session. Lors de la vérification de la clé, dirigez-vous d'abord vers le redis correspondant en fonction de l'uid. Si la clé ne peut pas être obtenue, cela signifie que la clé a expiré et que vous devez vous reconnecter si la clé est obtenue et que la vérification réussit, l'expiration ; le temps du ciel peut être amélioré.

4. Set nx ou SetNx, Set uniquement lorsque la clé n'existe pas. Il peut être utilisé pour élire le maître ou implémenter des verrous distribués : tous les clients essaient constamment d'utiliser le maître SetNx myName pour s'inscrire au maître, et celui qui réussit utilise constamment Expire pour actualiser son délai d'expiration. Si le maître meurt, la clé deviendra invalide et un nouveau cycle de saisie se produira sur les nœuds restants.

5. Avec le script Lua pris en charge par redis2.6, deux verrous distribués plus sécurisés peuvent être implémentés : l'un convient aux scénarios où les processus sont en concurrence mais un seul processus acquiert toujours le verrou et le traite. À moins que le processus de traitement d'origine ne raccroche et que le verrou n'expire, le verrou sera acquis par d'autres processus. Pas besoin de le déverrouiller activement. Implémenté via des scripts Lua de get, expire/pexpire, setnx ex| px ; un scénario adapté à chaque processus pour rivaliser pour acquérir des verrous et les traiter. Obtenez le verrou via set nx ex| px Après utilisation, vous devez d'abord juger par get, puis libérer le verrou par del. Sinon, le verrou ne peut pas être obtenu avant l'expiration du verrou.

6. GetSet, définit la nouvelle valeur et renvoie l'ancienne valeur. Par exemple, pour implémenter un compteur, vous pouvez utiliser GetSet pour obtenir le compte et le remettre à 0.

7. GetBit/SetBit/BitOp/BitCount, comment jouer à BitMap, par exemple, en comptant le nombre d'utilisateurs visiteurs uniques aujourd'hui, chaque utilisateur enregistré a un décalage s'il entre aujourd'hui, définissez son bit. à 1. Utilisez BitCount pour obtenir le nombre total de personnes aujourd'hui.

8. Append/SetRange/GetRange/StrLen, étendre, remplacer, tronquer et trouver la longueur du texte, ce qui est très utile pour des formats de données spécifiques.

Méthode d'implémentation : la chaîne est stockée dans redis en tant que chaîne par défaut, qui est référencée par redisObject. Lorsqu'elle rencontre des opérations incr, decr et autres, elle sera convertie en un type numérique pour le calcul. le champ d'encodage de redisObject est int .

2. Hash

Introduction : Hash stocke le mappage entre les chaînes et les valeurs de chaîne. Hash stocke divers attributs de l'objet dans la carte et ne peut lire/mettre à jour que certains attributs de l'objet. De cette façon, certaines propriétés trop longues peuvent être laissées seules. De plus, différents modules ne peuvent mettre à jour que les propriétés qui les intéressent sans provoquer de conflits d'écrasement dus à la concurrence les uns avec les autres.

Commandes courantes : hget, hset, hgetall, etc.

Scénarios d'application :

1. Stockez des données structurées, telles que des informations utilisateur. Dans Memcached ou CKV, pour les informations utilisateur telles que le surnom de l'utilisateur, son âge, son sexe, ses points, etc., nous devons d'abord les sérialiser et les stocker sous forme de valeur de chaîne à ce moment-là, lorsque nous devons modifier l'un des éléments. , nous avons généralement besoin de le faire. Une fois la valeur extraite et désérialisée, la valeur d'un élément est modifiée, puis sérialisée et stockée. Cela augmente non seulement la surcharge, mais ne convient pas non plus aux situations dans lesquelles des opérations simultanées sont possibles (par exemple, deux opérations simultanées nécessitent une modification de points). La structure de hachage de Redis vous permet de modifier uniquement une certaine valeur d'attribut, tout comme la mise à jour d'un attribut dans la base de données. Comme indiqué ci-dessous :

2. La clé est l'ID utilisateur, la valeur est une carte, la clé de cette carte est le nom de l'attribut du membre et la valeur est la valeur de l'attribut, de sorte que la modification et l'accès des données peut être effectuée directement via sa clé interne de la carte (la clé de la carte interne est appelée champ dans Redis), c'est-à-dire que les données d'attribut correspondantes peuvent être manipulées via la clé (ID utilisateur) + le champ (étiquette d'attribut ). Il n'est pas nécessaire de stocker les données à plusieurs reprises, et cela n'entraînera pas non plus de problèmes de contrôle des séquences et des modifications simultanées.

3. Cependant, il convient de noter ici que Redis fournit une interface (hgetall) pour obtenir directement toutes les données d'attribut. Cependant, s'il y a de nombreux membres de la Map interne, cela implique l'opération de parcourir toute la Map interne. En raison du modèle Redis à thread unique, cette opération de traversée peut prendre du temps et peut ne pas répondre du tout aux demandes des autres clients. Cela nécessite une attention particulière.

4. Peut être utilisé pour créer des index. Par exemple, les objets User, en plus de l'identifiant, doivent parfois également être interrogés par nom. Vous pouvez créer un hachage avec la clé user:name:id lors de l'insertion de l'objet User (set user:101{"id":101. ,"name": "calvin "}), au fait, insérez une entrée dans ce hachage (hset user:name:id calvin 101). À ce stade, calvin est utilisé comme clé dans le hachage, avec une valeur de). 101. Lors d'une requête par nom, utilisez hgetuser:name:id calvin pour obtenir l'identifiant de la clé nommée calvin. Si vous devez utiliser plusieurs index pour rechercher une certaine donnée, vous pouvez utiliser une seule clé de hachage pour éviter d'utiliser plusieurs clés de chaîne pour stocker les valeurs d'index.

5. HINCRBY peut également être utilisé pour implémenter idmaker. Par rapport à l'idmaker de type chaîne, chaque type nécessite une clé et le type de hachage n'a besoin que d'une seule clé.

Méthode d'implémentation :

Redis Hash correspondant à Value est en fait un HashMap. Lorsque le Hash a moins de membres, Redis utilisera un tableau unidimensionnel similaire à celui-ci. save memory. Méthode pour stocker de manière compacte sans utiliser la vraie structure HashMap. Le codage de la valeur correspondante redisObject est zipmap. Lorsque le nombre de membres augmente, il sera automatiquement converti en un véritable HashMap.

3. Liste

Introduction : La liste est une liste à double lien, prenant en charge le Pop/Push bidirectionnel. Les règles du monde poussent généralement depuis l'extrémité gauche, et Pop à l'extrémité droite - LPush/RPop, et il existe également une version bloquante BLPop/BRPop, où le client peut bloquer jusqu'à l'arrivée d'un message. Il existe également RPopLPush/BRPopLPush, qui apparaît et revient au client en même temps, il se place dans une autre liste et LLen obtient la longueur de la liste. Il existe aussi des opérations par valeur : LRem (supprimer des éléments par valeur), LInsert (insérer avant et après des éléments d'une certaine valeur), la complexité est O(N), N est la longueur de la Liste, car la valeur de la Liste n'est pas unique, donc pour parcourir tous les éléments, Set ne prend que O(log(N)).

Opérations effectuées par indice : l'indice part de 0, la file d'attente est comptée de gauche à droite, et lorsque l'indice est un nombre négatif, c'est de droite à gauche. LSet, définit la valeur de l'élément par indice. LIndex, renvoie l'élément par indice. LRange, contrairement à POP qui renvoie directement les éléments, ne renvoie que les éléments avec un indice dans la liste. C'est un favori pour la pagination. LTrim, limite la taille de la Liste, par exemple, ne conserve que les 20 derniers messages. La complexité est également O(N), où N de LSet est la longueur de la liste, N de LIndex est la valeur de l'indice et N de LRange est la valeur de start + le nombre d'éléments répertoriés. liste chaînée plutôt qu'un tableau, l'indice est qu'Access nécessite en fait de parcourir la liste chaînée, à moins que l'indice ne soit la tête et la queue de la file d'attente. N de LTrim est le nombre d'éléments à supprimer.

Commandes communes : lpush, rpush, lpop, rpop, lrange, etc.

Scénarios d'application :

1. Diverses listes, telles que la liste de suivi de Twitter, la liste de fans, etc., les derniers classements d'actualités, les commentaires sur chaque article, etc. peuvent également être implémentées à l'aide de Redis. structure de la liste.

2 File d'attente des messages, vous pouvez utiliser l'opération PUSH des listes pour stocker les tâches dans les listes, puis le thread de travail utilise l'opération POP pour supprimer les tâches à exécuter. La file d'attente de messages ici n'a pas de mécanisme de confirmation. Que se passe-t-il si le consommateur confie la tâche à Pop et plante avant de la terminer ? Une solution consiste à ajouter un ensemble trié supplémentaire. Lors de la distribution, envoyez-le à la liste et à l'ensemble trié en même temps. Le temps de distribution est utilisé comme score. Une fois la tâche terminée, l'utilisateur doit utiliser ZREM pour éliminer les tâches. dans l'ensemble trié et supprimez périodiquement les tâches de l'ensemble trié. Supprimez les tâches inachevées qui ont expiré et remettez-les dans la liste. Une autre approche consiste à ajouter une liste supplémentaire pour chaque travailleur, à utiliser RPopLPush lors de l'affichage des tâches, à placer le travail dans la propre liste du travailleur en même temps et à utiliser LREM pour l'éliminer une fois terminé. Si la direction du cluster (comme le gardien de zoo) constate que le travailleur est décédé, le contenu de la liste des travailleurs sera renvoyé dans la liste principale.

3 L'utilisation de LRANGE peut facilement réaliser la fonction de pagination du contenu de la liste.

4. L'opération d'obtention des dernières données N : LPUSH est utilisé pour insérer un identifiant de contenu et le stocker comme mot-clé en tête de liste. LTRIM est utilisé pour limiter le nombre d'éléments dans la liste à un maximum de 5 000. Si la quantité de données que l'utilisateur doit récupérer dépasse cette capacité du cache, la requête doit alors être envoyée à la base de données.

Méthode d'implémentation :

L'implémentation de la liste Redis est une liste chaînée bidirectionnelle, qui peut prendre en charge la recherche inversée et le parcours, ce qui est plus pratique à utiliser, mais cela entraîne une surcharge de mémoire supplémentaire .Redisinterne De nombreuses implémentations, y compris les files d'attente de tampon d'envoi, etc., utilisent également cette structure de données.

4. Ensemble

Introduction : Il s'agit d'un ensemble non ordonné. Les éléments de l'ensemble n'ont pas d'ordre et ne sont pas répétés. Mettre des éléments en double dans Set les supprimera automatiquement.

Commandes communes :

sadd, spop, smembers, sunion, etc.

Scénarios d'application :

1. Certaines listes qui doivent être dédupliquées et définies fournissent une interface importante pour déterminer si un membre est dans une collection définie. C'est également quelque chose que la liste ne peut pas fournir. .

2. Certaines données collectives peuvent être stockées. Par exemple, dans l'application Weibo, tous les abonnés d'un utilisateur peuvent être stockés dans une collection, et tous les fans peuvent être stockés dans une collection. Redis fournit également des opérations telles que l'intersection, l'union et la différence pour les collections, ce qui peut être très pratique pour implémenter des fonctions telles que l'attention commune, les préférences communes et les amis du deuxième degré. Pour toutes les opérations de collection ci-dessus, vous pouvez également utiliser différentes commandes. sélections. Renvoyez les résultats au client ou enregistrez-les dans une nouvelle collection. Pour un autre exemple, QQ dispose d'une fonction sociale appelée "Friend Tags". Vous pouvez identifier vos amis, tels que "grande beauté", "tycoon", "Ouba", etc. Ici, vous pouvez également stocker les tags de chaque utilisateur dans une collection. .

3. Si vous souhaitez savoir combien d'utilisateurs enregistrés ou d'adresses IP spécifiques ont visité une certaine page, vous pouvez faire ceci : SADD page:day1: Pour connaître le nombre d'utilisateurs spécifiques, utilisez SCARD page:day1:. Besoin de tester si un utilisateur spécifique a visité cette page ? Page SISMEMBER : jour 1 : .

Méthode d'implémentation :

L'implémentation interne de set est un HashMap dont la valeur est toujours nulle. En fait, elle est rapidement triée par calcul de hachage. C'est aussi ce que set peut fournir pour déterminer si. un membre est Reason dans l'ensemble.

5. Ensemble trié

Introduction : Ensemble trié, par rapport à l'ensemble, le score de l'élément est également fourni lorsque l'élément est placé dans l'ensemble, et il peut être automatiquement trié en fonction du score.

Commandes courantes :

zadd, zrange, zrem, zcard, etc.

Scénarios d'utilisation :

1. Les listes, telles que la chronologie publique de Twitter, peuvent être stockées avec l'heure de publication comme score, de sorte qu'elles soient automatiquement triées par heure lors de leur récupération.

2. Vous pouvez créer une file d'attente pondérée. Par exemple, le score des messages ordinaires est de 1 et le score des messages importants est de 2. Ensuite, le thread de travail peut choisir d'obtenir les tâches de travail dans l'ordre inverse. de la partition. Priorisez les tâches importantes.

3. Classement lié : classement ZADD Il est facile d'obtenir les 100 meilleurs utilisateurs avec les meilleurs scores : classement ZREVRANGE 0 99. Le classement global de l'utilisateur est également similaire, il suffit d'exécuter : ZRANK leaderboard .

4. Les nouvelles sont triées en fonction des votes des utilisateurs et du temps. Score pendant ZADD = points / temps ^ alpha De cette façon, les votes des utilisateurs extrairont les nouvelles en conséquence, mais le temps les enterrera selon un. certain indice.

5. Traitement des éléments expirés : utilisez l'heure unix comme mot-clé pour conserver la liste triée par heure. Récupérez current_time et time_to_live pour terminer la tâche difficile de trouver les éléments expirés. Une autre tâche en arrière-plan utilise ZRANGE...WITHSCORES pour interroger et supprimer les entrées expirées.

Méthode d'implémentation :

L'ensemble trié Redis utilise en interne HashMap et la liste de sauts (SkipList) pour garantir le stockage et l'ordre des données. HashMap place le mappage des membres vers les scores, et ignore tous les membres. stocké dans la table, et la base de tri est le score stocké dans le HashMap. L'utilisation de la structure de table de saut peut obtenir une efficacité de recherche plus élevée et est relativement simple à mettre en œuvre.

Pour plus de connaissances sur Redis, veuillez faire attention à la colonne Tutoriel de base de données Redis.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn