Maison  >  Article  >  développement back-end  >  Quels sont les types de données de Redis ? Résumé des différents types de données de Redis

Quels sont les types de données de Redis ? Résumé des différents types de données de Redis

不言
不言original
2018-09-13 17:20:386804parcourir

Cet article vous explique quels sont les types de données Redis ? Le résumé de chaque type de données de Redis a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

Avant-propos

  1. Redis est une base de données open source de type journal, clé-valeur écrite en langage ANSI C, prend en charge le réseau, peut être basée sur la mémoire et peut également être persistant. Et fournit des API dans plusieurs langues.

  2. Il s'agit d'un serveur de structure de données en mémoire qui peut être utilisé comme courtier de base de données, de cache et de file d'attente de messages.

  3. Assure un accès à haut débit en conservant toutes les données en mémoire, et fournit en même temps la fonction d'atterrissage des données. C'est le principal scénario applicable de Redis.

  4. reids possède une réplication intégrée, des scripts Lua, une récupération LRU, des transactions et différents niveaux de fonctions de persistance du disque. Il offre également une haute disponibilité via Redis Sentinel et un partitionnement automatique via Redis Cluster.

  5. Redis prend en charge les types de données tels que les chaînes, les tables de hachage, les listes, les ensembles, les ensembles ordonnés, les bitmaps et les hyperloglogs.

  6. Les types de données Redis les plus couramment utilisés : Stirng, hash, list, set, sorted set, pub/sub, transactions.

Type chaîne

  1. Le type chaîne est un simple type clé-valeur. La valeur n'est pas seulement une chaîne, mais aussi un nombre.

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

  3. En plus de fournir les mêmes opérations get, set, incr, decr et autres que memcached, redis fournit également les opérations suivantes :

(1) Obtenez la longueur de la chaîne ;
(2) Ajoutez du contenu à la chaîne
(3) Définissez et obtenez une certaine section de la chaîne
(4) Définissez et obtenez une certaine section ; de la chaîne Bit (bit);
(5) Définir le contenu d'une série de chaînes par lots

Le type de hachage

  1. le hachage est particulièrement adapté à stocker des objets.

  2. Commandes courantes : hget, hset, hgetall, etc.

  3. Scénario d'application : stockez certaines données structurées, telles que le surnom, l'âge, le sexe, les points, etc. de l'utilisateur, et stockez des données d'objet d'informations utilisateur.

  4. Prenons un exemple simple pour décrire le scénario d'application de Hash. Par exemple, nous stockons les données d'un objet d'information utilisateur, comprenant les informations suivantes :

(1) L'identifiant de l'utilisateur est la clé à rechercher ;
(2) La valeur stockée comprend le nom, l'âge, l'anniversaire et d'autres informations

1. > (1) La clé est l'ID utilisateur, la valeur est une carte.

(2) La clé de cette Map est le nom de l'attribut du membre, et la valeur est la valeur de l'attribut

(3) De cette façon, la modification et l'accès aux données peuvent se faire directement via la clé ; de la carte interne (appelée interne dans redis) La clé de la carte est le champ), c'est-à-dire que la clé (identifiant du nom d'utilisateur) + le champ (nom de l'attribut) peuvent exploiter les données d'attribut correspondantes.

2. Remarque :

(1) redis fournit une interface (hgetall) pour obtenir directement toutes les données d'attribut, mais s'il y a de nombreux membres de la carte interne, cela implique de parcourir toute la carte fonctionner.

(2) En raison du modèle redis à thread unique, cette opération de traversée peut prendre du temps et les autres demandes des clients peuvent ne pas recevoir de réponse du tout. Cela doit être noté.


Type de liste

    Le type de liste est essentiellement une liste doublement chaînée dans laquelle chaque élément est de type chaîne. Cela permet à la liste d'être utilisée soit comme une pile, soit comme une liste. une file d'attente.
  1. Le type de liste est souvent utilisé dans les services de file d'attente de messages pour compléter l'échange de messages entre plusieurs programmes.
  2. Commandes communes : lpush, rpush, lpop, rpop, lrange, etc.
  3. Scénario d'application : implémentez des fonctions telles que le classement des dernières actualités, ainsi que la file d'attente des messages.
  4. Exemple d'analyse simple de la file d'attente de messages :
  5. (1) Supposons qu'une application exécute lpush pour ajouter de nouveaux éléments à la liste chaînée. un programme est appelé un « producteur » ;
(2) Pendant qu'une autre application effectue l'opération rpop pour supprimer des éléments de la liste chaînée, nous appelons un tel programme un « consommateur » ;

(3) Pendant le processus des messages consommateurs, rpop doit être appelé en permanence pour vérifier s'il y a des messages en attente dans la liste. Chaque appel lancera un lien, provoquant un gaspillage inutile.
(4) De plus, si la vitesse du producteur est supérieure à la vitesse du consommateur, la longueur de la file d'attente des messages continuera d'augmenter, ce qui occupera beaucoup d'espace mémoire au fil du temps
(5) Par conséquent, vous pouvez utiliser la commande brpop, qui ne renvoie que s'il y a un élément, sinon elle bloquera jusqu'à l'expiration du délai et renverra null.

Type d'ensemble

    Le type d'ensemble est une collection non ordonnée de type chaîne.
  1. Le concept d'un ensemble est un ensemble de valeurs uniques.
  2. L'élément ensemble peut contenir jusqu'à (2 à la puissance 32 - 1) éléments.
  3. L'implémentation interne de set est un HashMap dont la valeur est toujours nulle.
  4. La fonction externe fournie par set est similaire à list, qui est une fonction de liste. La particularité est qu'elle peut éliminer automatiquement les doublons pendant le set.
  5. Commandes communes : sadd, spop, smembers, sunion, etc.
  6. Lorsque vous avez besoin de stocker une liste de données et que vous ne voulez pas de données en double, set est un bon choix.
  7. Et set fournit une interface importante pour déterminer si un membre fait partie d'une collection définie, ce que la liste ne peut pas fournir.

  8. En utilisant la structure de données définie, vous pouvez stocker certaines données collectives. Par exemple, dans une application Weibo, vous pouvez stocker tous les abonnés d'un utilisateur dans un ensemble et tous ses fans. Une collection.

  9. Redis fournit également des opérations telles que l'intersection, l'union et la différence pour les ensembles, 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é.

Type Zset

  1. Comme set, l'ensemble trié est également une collection d'éléments de type chaîne. La différence est que chaque élément est associé à une partition de type double, et l'ordre des éléments est déterminé par la partition.

  2. l'ensemble trié est ordonné par insertion, c'est-à-dire automatiquement trié.

  3. Commandes communes : zadd, zrange, zrem, zcard, etc.

  4. Lorsque vous avez besoin d'une liste d'ensembles ordonnés et non dupliqués, vous pouvez choisir la structure de données de l'ensemble trié.

  5. Exemple d'application :

(1) Par exemple, pour stocker les notes de toute la classe, la valeur définie peut être le numéro d'élève du camarade de classe, et score Cela peut être des notes.
(2) Application de classement, répertoriant les meilleurs utilisateurs en fonction des scores, etc.

pub/sub

  1. Les trois commandes s'abonner, se désabonner et publier implémentent des génériques de publication et d'abonnement.

  2. L'expéditeur (le client qui envoie les informations) n'envoie pas directement les informations au destinataire spécifique (le client qui reçoit les informations), mais envoie les informations au canal (canal ), La chaîne transmet ensuite l'information à tous les abonnés intéressés par la chaîne.

  3. L'expéditeur n'a pas besoin de connaître d'informations sur l'abonné, et l'abonné n'a pas besoin de savoir quel client lui a envoyé les informations, il doit seulement faire attention au canal qui l'intéresse.

  4. Publier/s'abonner dans Redis, qui est conçu pour être très léger et concis. Il atteint les fonctionnalités de base de publication et d'abonnement des messages, mais il n'a pas encore fourni d'informations sur la persistance des messages ; et d'autres aspects.

  5. Un client Redis publie des messages et plusieurs autres clients Redis s'abonnent aux messages. Les messages publiés sont perdus dès qu'ils sont envoyés. Redis ne peut pas conserver les messages publiés. get only Une fois le message abonné, les messages précédents du canal ne peuvent pas être obtenus.

  6. L'éditeur de message, c'est-à-dire le client de publication, n'a pas besoin d'un lien exclusif. Vous pouvez utiliser le même lien redis-client pour effectuer d'autres opérations (telles que incr, etc. ) lors de la publication du message ;

  7. L'abonné au message, c'est-à-dire le client d'abonnement, a besoin d'un lien exclusif, c'est-à-dire que pendant la période d'abonnement, le client redis ne peut pas intercaler d'autres opérations.

  8. À l'heure actuelle, le client attend les messages du côté publication de manière bloquante, donc l'abonnement doit utiliser un lien séparé ou même être utilisé dans un fil de discussion supplémentaire.

  9. Le temps de connexion TCP par défaut est corrigé. Si le côté secondaire ne reçoit pas le message côté pub dans ce monde, ou si le côté pub ne génère pas de message, la connexion côté secondaire sera recyclés de force.

  10. Ceci nécessite des moyens spéciaux pour être résolu. Utilisez une minuterie pour simuler le mécanisme de maintien entre pub et sub. La durée de la minuterie ne peut pas dépasser la durée maximale de connexion TCP.

  11. Une fois que la fin de l'abonnement a déconnecté le lien, certains messages seront perdus, c'est-à-dire que les messages pendant la période d'échec du lien seront perdus. Par conséquent, la liste Redis doit être prise en compte ici. pour la persistance ;

  12. Si vous êtes très préoccupé par chaque message, vous devriez effectuer un travail supplémentaire supplémentaire basé sur Redis. Si vous souhaitez que l'abonnement soit durable, alors les idées de conception suivantes. peut être utilisé à titre de référence :

(1) Côté abonnement : ajoutez d'abord un "identifiant d'abonné" à une collection d'ensembles. Cette collection d'ensembles enregistre les "abonnés actifs" ; abonné. Cet ensemble Pour la "collection d'abonnés actifs".
(2) La fin d'abonnement démarre l'opération d'abonnement et crée une structure de données de liste avec l'identifiant d'abonné comme clé basée sur redis. Cette liste stocke tous les messages non consommés. Cette liste est appelée la "file d'attente des messages d'abonné" (3) Côté publication : après la publication de chaque message, le côté publication doit parcourir la collection d'abonnés actifs et ajouter le message publié à la fin de chaque "file d'attente des messages d'abonné"
(4) Jusqu'à présent, nous pouvons essentiellement garantir que chaque message publié sera stocké de manière persistante dans chaque « file d'attente des messages d'abonné »
(5) Du côté de l'abonnement, chaque fois qu'un message d'abonnement est reçu, il sera Après cela, vous devez supprimer un message ; en tête de votre « File d'attente des messages d'abonné » ;
(6) Lorsque la fin de l'abonnement est démarrée, si vous constatez qu'il reste des enregistrements dans votre « File d'attente de messages d'abonné », ceux-ci seront consommés en premier, puis souscrits.

  1. La méthode ci-dessus peut garantir que les messages arrivés avec succès doivent être consommés et non perdus

transactions

  1. redis Une transaction peut exécuter plusieurs commandes à la fois.

  2. Une transaction passera par trois étapes du début à l'exécution :

(1) Démarrer la transaction

(2) Mise en file d'attente des commandes
(3) Exécuter la transaction

Une transaction est une opération d'isolation distincte : toutes les commandes de la transaction seront sérialisées et exécutées dans l'ordre.

Lors de l'exécution de la transaction, celle-ci ne sera pas interrompue par les demandes de commandes envoyées par d'autres clients.

L'exécution d'une seule commande redis est atomique, mais redis n'ajoute aucun mécanisme pour maintenir l'atomicité sur la transaction, donc l'exécution de la transaction redis n'est pas atomique.

Une transaction peut être comprise comme un script d'exécution par lots packagé, mais les instructions par lots ne sont pas des opérations atomiques. L'échec d'une instruction au milieu n'entraînera pas l'annulation des instructions précédentes, ni les instructions suivantes. Ne le fais pas.

Les commandes multi, exec, throw et watch sont à la base des transactions redis.

multi :

(1) La commande multi est utilisée pour démarrer une transaction, et elle renvoie toujours ok.
(2) Une fois la commande multi exécutée, le client peut continuer à envoyer n'importe quel nombre de commandes au serveur
(3) Ces commandes ne seront pas exécutées immédiatement, mais seront placées dans une file d'attente ; 🎜>( 4) Lorsque la commande exec est appelée, toutes les commandes de la file d'attente seront exécutées.

exec :

(1) La commande exec est responsable du déclenchement et de l'exécution de toutes les commandes de la transaction

(2) Si le client utilise multi pour ; open a Après la transaction, si la commande exec n'est pas exécutée avec succès en raison d'une déconnexion, toutes les commandes de la transaction ne seront pas exécutées.
(3) D'un autre côté, si le client exécute avec succès la commande exec après l'ouverture de la transaction, toutes les commandes de la transaction seront exécutées.

rejet :

(1) En appelant le rejet, le client peut vider la file d'attente des transactions et renoncer à l'exécution de la transaction.


watch :

(1) La commande watch peut fournir un comportement de vérification et de définition (CAS) pour les transactions Redis.

(2) watch permet d'exécuter la commande exec sous condition : la transaction ne peut être exécutée que sous l'hypothèse que toutes les clés surveillées n'ont pas été modifiées. Si cette condition n'est pas remplie, la transaction ne sera pas exécutée.
(3) Si vous utilisez watch pour surveiller une clé avec un délai d'expiration, même si la clé expire, la transaction peut toujours être exécutée.
(4) watch peut être appelé plusieurs fois, et la surveillance de l'état de santé prend effet à partir du moment où watch est exécuté jusqu'à ce que exec soit appelé.
(5) Lorsque exec est appelé, que la transaction soit exécutée avec succès ou non, la surveillance de l'ensemble de l'état de santé sera annulée.
(6) Lorsque le client déconnecte le lien, la surveillance de la santé du client sera également annulée.

Recommandations associées :

Type de données Redis - chaîne

Type de données de base Redis et opérations associées

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