Maison > développement back-end > tutoriel php > Explication détaillée de 5 structures de données Redis

Explication détaillée de 5 structures de données Redis

小云云
Libérer: 2023-03-21 09:02:02
original
5681 Les gens l'ont consulté

Dans cet article, nous partageons principalement avec vous des explications détaillées sur 5 structures de données Redis. Nous espérons que les cas et les codes de l'article pourront aider tout le monde.

2.1.1 Commande globale

1 Afficher toutes les clés clé*

2 Nombre total de clés dbsize (la commande dbsize ne calculera pas le nombre total de clés) Parcourez toutes les clés, mais obtenez directement le nombre total de clés intégrées dans Redis. La complexité temporelle est O(1), tandis que la commande key parcourra toutes les clés et la complexité temporelle est O(n). un grand nombre de clés, la ligne Il est interdit d'utiliser dans l'environnement ci-dessus)

3 Vérifier si la clé existe existe la clé renvoie 1 si elle existe, et 0 si elle n'existe pas

4 Supprimer la clé del key Renvoie le nombre de clés supprimées avec succès, si elle n'existe pas, renvoie 0

5 L'expiration de la clé expire la clé secondes La commande ttl renverra le temps d'expiration restant -1 La clé n'a pas de délai d'expiration défini -2 La clé n'existe pas

6 Type de structure de type de données de clé Type de retour de clé, n'existe pas et n'en renvoie aucun

2.1.2 Structure des données et encodage interne

Chaque structure de données a sa propre implémentation d'encodage interne sous-jacente, et il s'agit de plusieurs implémentations, de sorte que Redis choisira l'encodage interne approprié dans le scénario approprié

Chaque structure de données a plus de deux implémentations d'encodage interne.Par exemple, la structure de données de liste comprend l'encodage interne de linkedlist et ziplist, vous pouvez interroger l'encodage interne via la commande d'encodage d'objet

 La conception de Redis a. deux avantages : premièrement, il peut améliorer le codage interne sans affecter les structures de données et les commandes externes. Deuxièmement, plusieurs implémentations de codage interne peuvent exercer leurs avantages respectifs dans différents scénarios. Par exemple, ziplist économise de la mémoire, mais lorsqu'il y a de nombreux éléments de liste, les performances diminuent. À ce stade, Redis convertira l'implémentation interne du type de liste en liste liée

en fonction des options de configuration 2.1. .3 Architecture à thread unique

Redis utilise une architecture à thread unique et des modèles de réutilisation multi-routes d'E/S pour obtenir des services de base de données de mémoire hautes performances

1 leader un modèle à thread unique


Le processus d'appel du client : envoi de la commande, exécution de la commande et renvoi du résultat


                                          les commandes sont mises en file d'attente dans une file d'attente en attente d'être exécuté, Il n'y a aucune situation où plusieurs commandes sont exécutées en même temps


2 Pourquoi un seul thread peut-il s'exécuter si vite

Premièrement, accès à la mémoire pur, Redis met toutes les données en mémoire, et la réponse de la mémoire Le temps est d'environ 100 nanosecondes, ce qui est une base importante pour que Redis puisse atteindre 10 000 niveaux d'accès par seconde

Deuxièmement, les E/S non bloquantes, Redis utilise epoll comme implémentation de Technologie de multiplexage d'E/S, puis De plus, le propre modèle de traitement d'événements de Redis convertit la connexion, la lecture, l'écriture et la fermeture dans epoll en événements, afin de ne pas perdre trop de temps sur les E/S réseau


Trois threads uniques évitent la consommation de commutation de thread et les conditions de course

Un seul thread apporte plusieurs avantages : Premièrement, un seul thread simplifie la mise en œuvre des structures de données et des algorithmes. Deuxièmement, le filetage unique évite la consommation causée par le changement de thread et les conditions de concurrence. Cependant, il existe des exigences pour l'exécution de chaque commande. Si le temps d'exécution d'une certaine commande est trop long, d'autres commandes seront bloquées. Redis est une base de données pour les scénarios d'exécution rapides. Un seul thread est au cœur de la compréhension de Redis. 🎜> 2.2 String


Le type chaîne de Redis est la base de plusieurs autres types. La valeur peut être une chaîne (json simple ou complexe, xml), un nombre (entier, virgule flottante). , Binaire (images, audio, vidéo), la valeur maximale ne peut pas dépasser 512 Mo > 1 Commandes communes

1 Définissez la valeur de la valeur de la clé deuxième délai d'expiration en millisecondes > Scénarios d'application : Puisque Redis est un. mécanisme de traitement de commande à thread unique, si plusieurs clients exécutent la valeur de clé setnx en même temps, selon les caractéristiques, un seul client peut la définir avec succès, ce qui peut être utilisé comme solution d'implémentation pour les verrous distribués

2 Récupérez la valeur get key si elle n'existe pas et retournez nil

3 Définissez la valeur mset key value par lots


4 Récupérez la valeur mget key in lots 🎜>

Apprendre à utiliser les opérations par lots contribuera à améliorer l'efficacité du traitement métier, mais vous devez faire attention au fait que les commandes envoyées dans chaque opération par lots ne sont pas incontrôlées. Trop de commandes provoqueront un blocage Redis ou une congestion du réseau


Touche d'augmentation à 5 comptes


Il existe trois situations pour le résultat renvoyé


La valeur est un entier et le résultat après auto-incrémentation est renvoyé

Les clés n'existent pas, selon la valeur de 0, le résultat renvoyé est 1

et le derBy (numéro spécifié auto-croissant), derby Soustraire le nombre spécifié), incrbyfloat (incrémenter le nombre à virgule flottante)

2 Commandes peu courantes

1 Ajouter la valeur de la clé 2 Clé strlen de longueur de chaîne


3 Définir et renvoyer la valeur d'origine getset key value


4 Définir le caractère à la position spécifiée setrange key offset value

5 Récupérer une partie de la chaîne GetRANGE Key Début Fin

2.2.2 Encodage interne


L'encodage interne de la chaîne a 3 types : l'entier long EMBSTR de 8 octets est inférieur à A chaîne égale à 39 octets bruts A chaîne supérieure à 39 octets. Redis décidera quelle implémentation de codage interne utiliser en fonction du type et de la longueur de la valeur actuelle


2.2.3 Scénarios d'utilisation typiques


                                                                                                                                                                                                                     . Étant donné que Redis a la fonctionnalité de prendre en charge la simultanéité, la mise en cache peut généralement jouer un rôle dans l'accélération de la lecture et de l'écriture et dans la réduction de la pression back-end

: Méthode de dénomination du nom de clé : Nom de l'entreprise : Nom de l'objet : id : [ Attribut] comme nom de clé

Implémentation du pseudo-code :


2 comptages

Conseils de développement : Anti-triche, comptage selon différentes dimensions, la source de données des données est durable

3 Session de partage
UserInfo getUserInfo(long id){
    userRedisKey="user:info:"+id
    value=redis.get(userRedisKey);
    UserInfo userInfo;
    if(value!=null){
        userInfo=deserialize(value)
    }else{
        userInfo=mysql.get(id)
        if(userInfo!=null)
        redis.setex(userRedisKey,3600,serizelize(userInfo))
        }
Copier après la connexion
return userInfo
Copier après la connexion
}
Copier après la connexion

>
long incrVideoCounter(long id){
key="video:playCount:"+id;
return redis.incr(key)
}
Copier après la connexion


4 Limite de vitesse


 

                                                                                                                                                                                                                                        Cela signifie que la valeur clé elle-même est une structure de paire clé-valeur


2.3.1 Commande

1 Valeur définie

phoneNum="13800000000";
key="shortMsg:limit:"+phoneNum;

isExists=redis.set(key,1,"EX 60",NX);
if(isExists !=null ||redis.incr(key)<=5){
通过
}else{
限速
}
Copier après la connexion
                                                                                                                                                                                               4 Calculez le nombre de champs clé Hlen <🎜. >


5 Définir ou obtenir la valeur du champ par lots Champ de clé hmget Valeur du champ de clé hmset


6 Déterminer si le champ existe Champ de clé hexists

7 Obtenez toutes les clés hkeys de champ

8 Obtenez toutes les clés hvals de valeur


9 Obtenez toutes les clés hgetall de valeur de champ


Conseils de développement : si vous êtes sûr pour obtenir toutes les valeurs des champs. Vous pouvez utiliser la commande hscan. Cette commande parcourra progressivement le type de hachage


10 hincrby hincrby float

11 Calculer les caractères de value Longueur de la chaîne champ clé hstrlen


2.3.2 Encodage interne


Il existe deux types d'encodage interne :

ziplist (liste compressée) nombre d'éléments de hachage < ;hash- max-ziplist-entries, toutes les valeurs

                                                                                                                                                                                                                                              Scène

                                                       


UserInfo getUserInfo(long id){
userRedisKey="user:info:"+id;
userInfoMap=redis.hgetAll(userRedisKey);
userInfoMap userInfo;

if(userInfoMap!=null){
userInfo=transferMapToUserInfo(userInfoMap);
}else{
userInfo=mysql.get(id);
redis.hmset(userRedisKey,tranferUserInfoToMap(userInfo));
redis.expire(userRedisKey,3600);
}
return userInfo;
}
Copier après la connexion

             哈希类型和关系型数据库两点不同:

                1 哈希类型是稀疏的,而关系型数据库是完全结构化的

                2 关系型数据库可以做复杂的查询,而Redis去模拟关系型复杂查询开发困难,维护成本高

            三种方法缓存用户信息

                1 原声字符串类型:每个属性一个键

                    

               

                优点:简单直观,每个属性都支持更新操作

                缺点:占用过多的键,内存占用量较大,同时用户信息内聚性比较差,所以一般不会在生产环境用

               2 序列化字符串类型:将用户信息序列化后用一个键保存

        

                优点:简化编程,如果合理的使用序列化可以提高内存的使用效率

                缺点:序列化和反序列化有一定的开销,同时每次更新属性,都需要把数据取出来反序列化,更新后再序列化到Redis中

                3 哈希类型:每个用户属性使用一对field-value,但是只用一个键保存

                优点:简单直观,如果使用合理,可以减少内存空间的使用

                缺点:要控制哈希在ziplist和hashtable两种内部编码的转换,hashtable会消耗更多的内存

    2.4 列表

        列表类型用来存储多个有序的字符串,一个列表最多存储2的32次方-1个元素,列表是一种比较灵活的数据结构,它可以灵活的充当栈和队列的角色,在实际开发上有很多应用场景

        列表有两个特点:第一、列表中的元素是有序的,这就意味着可以通过索引下标获取某个元素或者某个范围内的元素列表。第二、列表中的元素可以是重复的

        2.4.1 命令

            1 添加操作

                 1.1 从右边往左插入元素 rpush key value

                 1.2 从左往右插入元素 lpush key value

                 1.3 向某个元素前或者后插入元素 linsert key before|after pivot value

                    

            2 查找

                1 获取指定范围内的元素列表 lrange key start end            

                  Les indices d'index ont deux caractéristiques : premièrement, les indices d'index sont 0-n-1 de gauche à droite et -1--n de droite à gauche. Deuxièmement, l'option de fin de lrange se contient, ce n'est pas le cas. comme de nombreux langages de programmation qui n'incluent pas la fin

2 Obtenez l'élément lindex key index

3 Obtenez la longueur de la liste llen key

3 Supprimer

1 Pop l'élément du côté gauche de la liste touche lpop

2 Pop la touche rpop

                                                                  valeur du nombre de clés lrem                             valeur du nombre de clés lrem                                           > Modifier l'index spécifié Élément cible lset key index newValue


5 Opération de blocage brpop blpop key timeout

1 La liste est vide : si timeout=3, alors le client attendra 3s pour revenir. Si timeout= 0, le client bloque et attend. Si des données sont ajoutées, le client retourne immédiatement


. 2 La liste n'est pas vide : le client renvoie immédiatement

3

2.4.2 Encodage interne

Il existe deux encodages internes pour types de liste

ziplist (liste compressée) : lorsque le nombre d'éléments de la liste est < list-max-ziplist-entries et list-max-ziplist-value (64 octets), Redis utilisera l'implémentation interne de la liste pour réduire l'utilisation de la mémoire

      Lorsque les conditions de la ziplist ne peuvent pas être remplies, Redis utilisera la liste liée comme implémentation interne de la liste

2.4. 3 Scénarios d'utilisation

1 File d'attente de messages


Redis La combinaison de la commande lpush+brpop peut réaliser une file d'attente bloquante


  🎜> Deux questions : Premièrement, si un grand nombre d'articles sont obtenus dans chaque pagination, plusieurs opérations hgetall doivent être effectuées dans ce cas, envisagez d'utiliser un pipeline pour obtenir par lots, ou envisagez de sérialiser les données de l'article en type chaîne et d'utiliser mget pour obtenir par lots. Deuxièmement, lors de l'obtention de la liste d'articles en pages, la commande lrange a de meilleures performances aux deux extrémités de la liste. Cependant, si la liste est plus grande, les performances d'obtention des éléments de milieu de gamme deviendront pires. vous pouvez envisager une division en deux niveaux

                                                                                                                       lpush+rpop=Queue(queue)

lpsh +ltrim=Capped Collection (collection limitée)

lpush+brpop=Message Queue(Message Queue)

2.5 Collection

Les ensembles sont utilisés pour stocker plusieurs éléments de chaîne différents des listes. sont des éléments en double et les éléments de l'ensemble ne sont pas ordonnés

2.5.1 Commandes

1 Opérations dans l'ensemble

1.1 Ajouter éléments sadd élément clé

1.2 Supprimer l'élément srem élément clé

1.3 Calculer le nombre d'éléments clé cicatrice

1.4 Déterminer si l'élément est dans l'élément clé sismember défini

1.5 Renvoie aléatoirement le nombre spécifié d'éléments de la clé srandmember de la collection

1.6 Extrait l'élément au hasard de la clé spop définie

1.7 Obtenir la clé smembers de tous les éléments

2 Opérations entre les ensembles

1 Trouver la clé de frittage d'intersection de plusieurs ensembles...

2 demandes Union de plusieurs ensembles clé suinon... Enregistrer

clé de destination sinterstore


clé de destination sdiffstore

destination suionstore clé

                                            🎜>

2.5.2 Encodage interne


Il existe deux types internes de types de collections :

intset (ensemble d'entiers) : lorsque les éléments de l'ensemble sont tous des entiers et que le nombre d'éléments est inférieur à la configuration set-max-intset-entries (par défaut 512), Redis utilisera intset comme implémentation interne de l'ensemble , réduisant ainsi l'utilisation de la mémoire

          Table de hachage) Lorsque le type de collection ne peut pas répondre aux conditions de l'intset, Redis utilisera la table de hachage comme implémentation interne de la collection

2.5. 3 Scénarios d'utilisation

Les scénarios d'application typiques des types de collections sont une étiquette.


1 Ajouter un tag à l'utilisateur


sadd user:1:tags tag1 tag2

2 Ajouter un utilisateur au tag

              sadd tag1:utilisateurs utilisateur:1 utilisateur:3

                                                                                                                                                                    sadd tag1:users user:1 user:3

                                             

3 Supprimez les balises sous l'utilisateur


srem user:1:tags tag1 tag5


4 Supprimez l'utilisateur sous la balise


balise srem1:utilisateurs utilisateur:1


5 Calculer les tags d'intérêt commun aux utilisateurs

sinter user:1 tags user:2 tags

Conseils de développement : sadd=Tagging(tag) spop/srandmember =Élément aléatoire (générer des nombres aléatoires, comme la loterie)

spop/srandmember=Élément aléatoire (générer des nombres aléatoires, comme la loterie) sadd+sinter=Social Graph (besoins sociaux)

2.6 Ensemble ordonné

Un ensemble ordonné consiste à ajouter une partition à l'ensemble comme base de tri

2.6.1 Commande

1 Dans la collection

1Ajouter un membre zadd key score memeber

nx xx ch renvoie le nombre d'éléments et les scores de l'ensemble ordonné qui ont changé après cette opération, incr : augmenter le score

Les ensembles ordonnés fournissent un champ de tri par rapport aux ensembles, mais ils produisent aussi Compte tenu du coût, la complexité temporelle de zadd est O(log(n)), et la complexité temporelle de sadd est O(1)

2 Calculez le nombre de membres

Scard key

3 Calculer le score d'un membre zscore key member

4 Calculer le classement du membre zrank key member

5 Supprimer le membre zrem clé membre

6 Augmenter le score du membre zincrby clé incrément membre

7 Renvoie les membres dans la plage de classement spécifiée zrange clé début fin

      8 Retourne aux membres spécifiés de la plage de scores zrangebysore key min max

9 Renvoie le nombre de membres dans la plage de scores spécifiée zcount key min max

10 Supprimer les éléments ascendants dans le classement spécifié zremrangebyrank key start end

11 Supprimer les membres de la plage de scores spécifiée zremrangebyscore key min max

2 Opérations entre les ensembles

1 Touche numérique de destination Intersection zinter store

2 Touche numérique de destination Union zunionstore

2.6.2 Encodage interne

Là existe deux encodages internes pour les types d'ensembles ordonnés : 🎜>
Ziplist (liste compressée) Lorsque l'ordre de la collection ordonnée est inférieur à la configuration ZSET-MAX-Ziplist-Entries et que la valeur de chaque élément est plus petite que la configuration ZSET-MAX-Ziplist-Value, Redis utilisera Ziplist En tant qu'implémentation interne des ensembles ordonnés, ziplist peut réduire efficacement l'utilisation de la mémoire


skiplist (skip list) Lorsque les conditions de la ziplist ne sont pas remplies, Les ensembles ordonnés utiliseront skiplist comme implémentation interne, donc ceci L'efficacité de lecture et d'écriture de ziplist diminuera


2.6.3 Scénarios d'utilisation


Un scénario d'utilisation typique pour les collections ordonnées est le système de classement. Par exemple, un site Web de vidéos doit classer les vidéos mises en ligne par les utilisateurs

1 Ajouter les likes de l'utilisateur zdd user:ranking:2016_03_15 mike 3

1 Puis zincrby user:ranking:2016_03_15 mike 1

2 Annuler les likes de l'utilisateur

                                                                                                                                                                                                                                                   ;                         zrevrangebyrank user:ranking:2016_03_15 0 9

4 Afficher les informations et les scores de l'utilisateur

Cette fonction peut utiliser le nom de l'utilisateur comme clé suffixe et enregistrez les informations de l'utilisateur dans un type de hachage. En ce qui concerne le score de l'utilisateur et le classement, vous pouvez utiliser les deux fonctions zcore et zrank                                                                             2.7.1 Unique. Gestion des clés

1 clé renommer la clé nouvelle clé

2 renvoie aléatoirement une clé randomkey

3 expiration de la clé -1 la clé n'est pas définie Délai d'expiration -2 la clé n'existe pas

expire la clé secondes : La clé expire après secondes secondes

expire key itmestamp La clé expire après le deuxième timestamp timestamp

1 Si la clé d'Expire Key n'existe pas, le résultat renvoyé est 0


2 Si le délai d'expiration est négatif, la clé sera supprimée immédiatement, tout comme en utilisant la commande Del


3 La commande persist peut effacer le délai d'expiration du key


4 Pour les clés de type chaîne, l'exécution de la commande set supprimera le délai d'expiration. Ce problème est facilement négligé en développement

5 Redis ne prend pas en charge la fonction d'expiration. des éléments internes de la structure de données secondaire. Par exemple, le délai d'expiration ne peut pas être défini pour un élément de ce type de liste


6 La commande setex est utilisée comme une combinaison set+expire. s'exécute de manière atomique, mais réduit également le temps de communication réseau


4 Clés de migration


La fonction de clé de migration est très importante Il existe trois groupes de clés de migration : déplacer, dump+restore et migrate. Les méthodes, leurs méthodes d'implémentation et leurs scénarios d'utilisation sont différents


1 déplacement est utilisé pour la migration des données au sein de Redis


2 dump+restore est implémenté dans différents Redis La fonction de migration des données entre instances. Cette migration est divisée en deux étapes


1. Sur le Redis source, la commande dump sérialisera la valeur de la clé au format RDB


2 Sur le Redis cible, la commande de restauration restaure la valeur sérialisée ci-dessus, où le paramètre ttl représente le délai d'expiration


La commande 3 migrate est utilisée pour migrer les données entre les instances Redis

2.7.2 Traverser les clés

Redis fournit deux commandes pour parcourir toutes les clés respectivement. Ce sont les clés et scan

1 Parcours complet du modèle de touches

* Représente la correspondance avec n'importe quel caractère

                           . >
[] représente la correspondance d'un caractère


Une grande quantité peut facilement provoquer un blocage


2 Traversée progressive


Le scan peut être pensé comme scanner seulement une partie des clés d'un dictionnaire Jusqu'à ce que tous les dictionnaires du dictionnaire,

les commandes correspondantes soient HSAN, SSCAN, ZCAN

Le parcours progressif peut résoudre efficacement le problème d'obstruction que la commande de clés peut survenir. Lors de l'ajout ou de la suppression, il n'est pas garanti que les nouvelles clés transitent vers

2.7.3 Gestion de la base de données

1 Sélectionner la base de données. dbIndex


2 flushdb/flushall permet d'effacer la base de données, ce qui provoquera un blocage lorsqu'il y a beaucoup de données


2.8 Revue de la fin de ce chapitre


Recommandations associées :


Structure 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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal