Cet article vous apporte des connaissances pertinentes sur les types de données dans Redis Il présente principalement les problèmes liés aux scénarios d'utilisation courants des types de données. J'espère qu'il sera utile à tout le monde.
Apprentissage recommandé : Tutoriel d'apprentissage Redis
Types de données Redis et scénarios d'utilisation
Par rapport aux autres bases de données KV, l'une des principales caractéristiques de Redis est qu'il prend en charge le type de données riche. Il prend en charge un total de 5 types de données. Ces 5 types de données, leurs scénarios d'utilisation et leur implémentation interne sont présentés un par un ci-dessous.
string
Introduction : Le type chaîne est le type de données le plus basique dans Redis, le type de données le plus couramment utilisé, et est même utilisé par de nombreux acteurs comme le seul type de données de Redis. Le type de chaîne est binaire sûr dans Redis, ce qui signifie que la valeur de la chaîne se soucie de la chaîne binaire et ne se soucie pas du format spécifique. Vous pouvez l'utiliser pour stocker des chaînes au format json ou au format d'image JPEG.
Obtenir la longueur de la chaîne
Ajouter du contenu à la chaîne
Définir et obtenir un certain contenu de la chaîne
Définir et obtenir un certain morceau de la chaîne
Définir le contenu d'une série de chaînes par lots
Commandes courantes : set, get, decr, incr, mget, etc.
Scénarios d'application :
(1) Stocker la valeur d'un champ dans MySQL
Concevoir la clé comme nom de table : nom de clé primaire : valeur de clé primaire : nom de champ
(2) Stocker des objets
Le type de chaîne prend en charge Les chaînes de n'importe quel format sont le plus souvent utilisées pour stocker des chaînes json ou d'autres chaînes au format objet. (Il est recommandé d'utiliser le type de données de hachage dans ce scénario)
set user:id:1 '[{"id":1,"name":"zj","email":"156577812@qq.com"},{"id":1,"name":"zj","email":"156577812@qq.com"}]'
(3) Générer un ID auto-incrémenté
Lorsque la valeur du type de chaîne de redis est sous la forme d'un entier, redis peut la traiter comme un entier pour les opérations d'incrémentation automatique (incr) et de décrémentation automatique (decr). Étant donné que toutes les opérations Redis sont atomiques, vous n'avez pas à vous soucier des problèmes de transaction pouvant survenir lorsque plusieurs clients se connectent.
Commandes couramment utilisées : hget, hset, hgetall, etc.
Scénarios d'application :
Stockage de données structurées, telles que les 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 :
Key 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 cette manière, la modification et l'accès aux données peuvent être effectués. directement via la clé de sa carte interne (Redis La clé de la carte interne est appelée champ), c'est-à-dire que les données d'attribut correspondantes peuvent être manipulées via clé (ID utilisateur) + champ (étiquette d'attribut) Il n'est pas nécessaire de le faire à plusieurs reprises. stocker les données, et cela n'entraînera pas de question de sérialisation et de contrôle des modifications simultanées.
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 de la. 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.
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.
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é.
Le type de données de hachage a l'avantage d'être plus flexible et plus rapide que le type de chaîne lors du stockage des types de données ci-dessus, en utilisant le type de chaîne pour stocker, il est nécessaire de convertir et d'analyser les chaînes au format json. la conversion n'est pas nécessaire, en termes de surcharge de mémoire, le hachage a toujours l'avantage.
Méthode de mise en œuvre :
Redis Hash correspondant à Value est en fait un HashMap à l'intérieur. Il existe ici deux implémentations différentes. Lorsque le hachage a moins de membres, Redis utilisera une méthode de type tableau unidimensionnel pour le stocker de manière compacte afin d'économiser de la mémoire, au lieu de l'utiliser. la vraie structure HashMap. L'encodage de la valeur redisObject correspondante est zipmap. Lorsque le nombre de membres augmente, il sera automatiquement converti en un vrai HashMap. À ce stade, l'encodage est ht.
Introduction :
list est une liste chaînée triée par ordre d'insertion. De nouveaux éléments peuvent être insérés en tête et en queue (implémentation de liste doublement chaînée, complexité temporelle de l'ajout d'éléments aux deux extrémités). est O (1)). Lors de l'insertion d'un élément, si la clé n'existe pas, redis créera une nouvelle liste chaînée pour la clé. Si tous les éléments de la liste chaînée sont supprimés, la clé sera également supprimée de redis.
Commandes couramment utilisées : lpush, rpush, lpop, rpop, lrange, etc.
Scénarios d'application :
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 la structure de liste de Redis.
File d'attente de messages, vous pouvez utiliser l'opération PUSH des listes pour stocker des tâches dans des 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 fois à la liste et à l'ensemble trié. Le temps de distribution est utilisé comme score. Une fois la tâche terminée, l'utilisateur doit utiliser ZREM pour l'éliminer. les tâches de 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.
L'utilisation de LRANGE peut facilement réaliser la fonction de pagination du contenu de la liste.
Opération pour obtenir les 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 :
La liste Redis est implémentée sous la forme d'une liste chaînée bidirectionnelle, qui peut prendre en charge la recherche inversée et le parcours, ce qui la rend plus pratique à utiliser. Cependant, elle entraîne une surcharge de mémoire supplémentaire, de nombreuses implémentations dans Redis, y compris l'envoi. files d'attente tampon, etc. Cette structure de données est également utilisée.
Introduction : Il s'agit d'un ensemble non ordonné. Les éléments de l'ensemble ne sont pas ordonnés et ne se répètent pas. Mettre des éléments en double dans Set les supprimera automatiquement.
Commandes couramment utilisées :
sadd, spop, smembers, sunion, etc.
Scénarios d'application :
Certaines listes qui doivent être dédupliquées et définies fournissent une interface importante pour déterminer si un certain membre est dans une collection définie, ce que la liste ne peut pas fournir.
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. .
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:
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 pourquoi set peut déterminer si un membre est dans l'ensemble.
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 :
Stockez une liste de collecte ordonnée et non dupliquée. Par exemple, la chronologie publique de Twitter peut être stockée avec l'heure de publication comme score. , pour que vous puissiez l'obtenir. Le temps est automatiquement trié par temps.
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 du score. Priorisez les tâches importantes.
Traitement des éléments expirés : utilisez l'heure Unix comme 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 assurer le stockage et le classement des données. HashMap stocke le mappage des membres aux scores, tandis que la liste de sauts stocke tous les membres, 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.
Apprentissage recommandé : Tutoriel vidéo 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!