Maison > Article > base de données > Structures de données couramment utilisées dans Redis (organisées et partagées)
Cet article vous apporte des connaissances pertinentes sur Redis, qui présente principalement du contenu connexe sur les structures de données courantes. Il y en a cinq les plus couramment utilisées, à savoir la chaîne, le hachage, la liste, l'ensemble et l'ordre. j'espère que cela sera utile à tout le monde.
Apprentissage recommandé : Tutoriel vidéo Redis
Redis nous permet d'accéder aux données dans Redis. Il en existe 5 les plus couramment utilisées, String, Hash, list, set,. ensemble ordonné (ZSET).
Le type chaîne est la structure de données la plus basique de Redis. Tout d'abord, les clés sont toutes de type chaîne et plusieurs autres structures de données sont construites sur la base du type chaîne, de sorte que le type chaîne peut jeter les bases de l'apprentissage des quatre autres structures de données. La valeur du type chaîne peut en fait être une chaîne (chaîne simple, chaîne complexe (telle que JSON, XML)), un nombre (entier, nombre à virgule flottante) ou même binaire (image, audio, vidéo), mais la valeur est le plus grand ne peut pas dépasser 512 Mo.
(Bien que Redis soit écrit en C et qu'il existe des chaînes en C qui sont
set key value
La commande set a plusieurs options :
ex seconds : définit le délai d'expiration de deuxième niveau pour la clé.
px millisecondes : définissez le délai d'expiration en millisecondes de la clé.
nx : La clé ne doit pas exister avant de pouvoir être définie et utilisée avec succès pour l'ajout (couramment utilisée pour les verrous distribués).
xx : Contrairement à nx, la clé doit exister avant de pouvoir être définie avec succès et utilisée pour la mise à jour.
Du point de vue de l'effet d'exécution, le paramètre ex est fondamentalement le même que la commande expire. Une autre chose qui nécessite une attention particulière est que si une chaîne a un délai d'expiration défini et que vous appelez ensuite la méthode set pour la modifier, son délai d'expiration disparaîtra.
Les effets d'exécution de nx et xx sont les suivants
En plus de l'option set, Redis fournit également les commandes setex et setnx :
setex key seconds value
setnx key value
setex et setnx ont la même fonction que les options ex et nx. Autrement dit, setex définit le délai d'expiration de deuxième niveau pour la clé. La clé ne doit pas exister lorsque setnx est défini avant de pouvoir être définie avec succès.
Exemple setex :
Exemple setnx :
Parce que la clé foo-ex existe déjà, setnx échoue et le résultat renvoyé est 0. La clé foo-ex2 n'existe pas, donc setnx réussit et le le résultat de retour est 1 .
Existe-t-il des scénarios d'application ? Prenons l'exemple de la commande setnx. En raison du mécanisme de traitement des commandes à thread unique de Redis, si plusieurs clients exécutent la valeur de la clé setnx en même temps, un seul client peut la définir avec succès en fonction de la valeur de la clé setnx. Les caractéristiques de setnx peuvent être utilisées comme solution d'implémentation pour les verrous distribués. Bien sûr, le verrouillage distribué ne nécessite pas une seule commande. Nous utiliserons plus tard un chapitre séparé pour décrire le verrouillage distribué basé sur Redis.
Si la clé à obtenir n'existe pas, renvoyez nil (vide):
Définissez 4 paires clé-valeur à la fois via la commande mset
obtient les valeursdes clés a, b, c, d par lots :
Si certaines clés n'existent pas , alors leurs valeurssont nulles (vides) et le résultat est tel que transmis dans L'ordre dans lequel les clés sont saisies est renvoyé.
Les commandes d'opération par lots peuvent améliorer efficacement l'efficacité. S'il n'y a pas de commande comme mget, le temps spécifique requis pour exécuter n commandes get est le suivant :
n get times = n times réseau + n times de commande
Après avoir utilisé mget. command , le temps spécifique requis pour exécuter n opérations de commande get est le suivant :
n get time = 1 temps réseau + n temps de commande
Redis peut prendre en charge des dizaines de milliers d'opérations de lecture et d'écriture par seconde, mais cela fait référence à la capacité de traitement du serveur Redis, en plus du temps de commande, une commande a également du temps réseau. est de 1 milliseconde, le temps de commande est de 0,1 milliseconde (sur la base du traitement de 10 000 commandes par seconde), puis il faut 1,1 seconde pour exécuter 1 000 commandes get (1 0001+1 0000,1 = 1 100 ms) et 0,101 seconde pour 1 commande mget ( 11+1000 0,1=101ms).
La commande incr est utilisée pour incrémenter la valeur. Les résultats renvoyés sont divisés en trois situations :
La valeur n'est pas un entier et une erreur est renvoyée.
La valeur est un entier et le résultat après incrémentation est renvoyé. La clé
n'existe pas. Elle sera incrémentée selon la valeur de 0 et le résultat renvoyé sera 1.
En plus de la commande incr, Redis fournit decr (décrémentation automatique), incrby (incrémentation automatique jusqu'à un nombre spécifié), decrby (décrémentation automatique jusqu'à un nombre spécifié) et incrbyfloat (incrémentation automatique de un nombre à virgule flottante). Veuillez essayer les effets spécifiques par vous-même.
append peut ajouter une valeur à la fin de la chaîne
renvoie la longueur de la chaîne
Remarque : chaque caractère chinois occupe 3 octets
getset définit la valeur tout comme set, mais la différence est qu'il renvoie également la valeur d'origine de la clé
Les indices commencent à 0.
getrange intercepte une partie de la chaîne pour former une sous-chaîne Vous devez spécifier les décalages de début et de fin. La plage interceptée est un intervalle fermé.
String Parmi ces commandes, à l'exception de del, mset et mget qui prennent en charge les opérations par lots de plusieurs clés, la complexité temporelle est liée au nombre de clés, qui est O(n). getrange est lié à la longueur de la chaîne et est également O(n). Le reste des commandes a essentiellement une complexité temporelle de O(1), ce qui est toujours très rapide.
Le type chaîne a un large éventail de scénarios d'utilisation :
Fonction Cache
Redis comme couche de cache, MySQL comme couche de stockage, la plupart des données demandées sont obtenues à partir de Redis. Étant donné que Redis a la particularité de prendre en charge une simultanéité élevée, 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.
Comptage
En utilisant Redis comme outil de base pour le comptage, il peut réaliser les fonctions de comptage rapide et de mise en cache des requêtes, et les données peuvent être transférées de manière asynchrone vers d'autres sources de données.
Session partagée
Un service Web distribué enregistre les informations de session de l'utilisateur (telles que les informations de connexion de l'utilisateur) sur ses propres serveurs. Pour des raisons d'équilibrage de charge, le service distribué stockera les informations de session de l'utilisateur (. tels que les informations de connexion de l'utilisateur). L'accès est équilibré sur différents serveurs. Les utilisateurs qui actualisent l'accès peuvent constater qu'ils doivent se reconnecter. Ce problème est intolérable pour les utilisateurs.
Afin de résoudre ce problème, Redis peut être utilisé pour gérer de manière centralisée les sessions utilisateur. Dans ce mode, tant que Redis est hautement disponible et évolutif, chaque fois qu'un utilisateur met à jour ou interroge les informations de connexion, elles seront directement obtenues auprès de Redis. .
Limitation de vitesse
Par exemple, pour des raisons de sécurité, de nombreuses applications demanderont à l'utilisateur de saisir un code de vérification de téléphone portable à chaque fois qu'il se connectera pour déterminer s'il s'agit de l'utilisateur lui-même. Cependant, afin d'éviter que l'interface SMS ne soit consultée fréquemment, la fréquence à laquelle les utilisateurs obtiennent des codes de vérification par minute sera limitée, par exemple pas plus de 5 fois par minute. Certains sites Web empêchent qu'une adresse IP soit demandée plus de n fois par seconde, et une idée similaire peut être adoptée.
Java fournit HashMap, et Redis a également une structure de données similaire, qui est le type de hachage. Mais veuillez noter que la relation de mappage dans le type de hachage est appelée valeur de champ. Notez que la valeur ici fait référence à la valeur correspondant au champ, et non à la valeur correspondant à la clé.
Fondamentalement, les commandes d'opération de hachage sont très similaires aux commandes d'opération de chaîne. De nombreuses commandes ajoutent la lettre h devant la commande de type de chaîne, ce qui signifie que le type de hachage doit être utilisé, et en même temps. temps, il faut préciser la valeur du champ sur lequel on va opérer.
utilisateur hset : 1 nom lijin
Si le réglage réussit, il renverra 1, sinon il renverra 0. De plus, Redis fournit la commande hsetnx. Leur relation est la même que celle des commandes set et setnx, sauf que la portée change de clé en champ.
hget user:1 name
Si la clé ou le champ n'existe pas, nul sera renvoyé.
hdel supprimera un ou plusieurs champs, et le résultat renvoyé est le nombre de champs supprimés avec succès.
Si il existe, renvoie 1, s'il n'existe pas Renvoie 0
Il renvoie tous les champs avec la clé de hachage spécifiée
Lors de l'utilisation de hgetall, si Si le nombre d'éléments de hachage est relativement grand, il existe une possibilité de bloquer Redis. Si vous n'avez besoin d'obtenir qu'une partie du champ, vous pouvez utiliser hmget. Si vous devez obtenir toutes les valeurs du champ, vous pouvez utiliser la commande hscan. Cette commande parcourra progressivement le type de hachage qui sera présenté dans un chapitre ultérieur. .
hincrby et hincrbyfloat, tout comme les commandes incrby et incrbyfloat, mais leur portée est archivée.
Dans les commandes d'opération de type hachage, la complexité temporelle de hdel, hmget, hmset est liée au nombre de champs dans la commande O( k ), hkeys, hgetall, hvals sont liés au nombre total de champs stockés, O(N). La complexité temporelle du reste des commandes est O(1).
Comme vous pouvez le voir d'après les opérations précédentes, les opérations de String et Hash sont très similaires, alors pourquoi avez-vous besoin de créer un hachage pour le stockage ?
Le type de hachage est plus adapté au stockage de données de type objet. Nous pouvons le comparer si l'utilisateur dans l'enregistrement de la table dans la base de données est :
id | name | age |
---|---|---|
1. | lijin | 18 |
2 | msb | 20 |
1. L'utilisation du type String
nécessite l'insertion et la récupération un par un.
set user:1:name lijin;
set user:1:age 18;
set user:2:name msb;
set user:2:age 20;
Avantages : simple et intuitif, chacun La clé correspond à une valeur
Inconvénients : trop de clés, occupant beaucoup de mémoire, les informations utilisateur sont trop dispersées, non utilisées en environnement de production
2. Sérialiser l'objet et le stocker dans redis
.set user:1 serialize( userInfo);
Avantages : programmation simple, utilisation élevée de la mémoire si la sérialisation est utilisée
Inconvénients : la sérialisation et la désérialisation ont une certaine surcharge, lors de la mise à jour des attributs, toutes les informations utilisateur doivent être supprimées pour la désérialisation. Après la mise à jour, sérialisez sur redis
3. Utilisez le type de hachage
utilisateur hmset : 1 nom lijin âge 18
utilisateur hmset :2 nom msb âge 20
Avantages : simple et intuitif, utilisation raisonnable. peut réduire la consommation d'espace mémoire
Inconvénients : Pour contrôler le format d'encodage interne, les formats inappropriés consommeront plus de mémoire
Le type liste (liste) est utilisé pour stocker plusieurs chaînes ordonnées, un Les quatre les éléments , b, c, c et b forment une liste ordonnée de gauche à droite. Chaque chaîne de la liste est appelée un élément. Une liste peut stocker jusqu'à (2 ^ 32-1) élément (4294967295).
Dans Redis, vous pouvez insérer (push) et pop (pop) les deux extrémités de la liste, vous pouvez également obtenir une liste d'éléments dans une plage spécifiée, obtenir des éléments avec un indice d'index spécifié, etc. List est une structure de données relativement flexible qui peut agir comme une pile et une file d'attente et comporte de nombreux scénarios d'application en développement réel.
Le type de liste a deux caractéristiques :
Premièrement, les éléments de la liste sont ordonnés, ce qui signifie qu'un élément ou une liste d'éléments dans une certaine plage peut être obtenu via l'indice d'index.
Deuxièmement, les éléments de la liste peuvent être répétés.
clé début fin
Caractéristiques de l'indice d'index : 0 à N-1 de gauche à droite
commande lrange 0 -1 peut Récupérer tous les éléments de la liste de gauche à droite
Ces trois résultats renvoyés correspondent à la longueur de la liste actuelle une fois la commande terminée, qui correspond au nombre d'éléments contenus dans la liste en même temps, rpush et lpush prennent en charge l'insertion de plusieurs. éléments en même temps.
r
Veuillez noter que les éléments disparaîtront après leur apparition.
rpop fera apparaître l'élément d à l'extrême droite de la liste.
La commande lrem trouvera l'élément égal à la valeur de la liste et le supprimera. Il est divisé en trois situations selon le nombre :
count>0, de gauche à droite. à droite, supprimez au maximum les éléments.
count
count=0, supprimez tout.
La valeur de retour est le nombre d'éléments réellement supprimés.
Par exemple, si vous souhaitez conserver le 0ème au 1er élément de la liste
ls
l
blpop et brpop bloquent les versions de lpop et rpop en plus. , ils prennent également en charge plusieurs types de listes et prennent également en charge la définition du temps de blocage, en secondes. Si le temps de blocage est 0, cela signifie qu'il continuera à être bloqué. Prenons brpop comme exemple.
Un client est bloqué (car il le sera s'il n'y a aucun élément)
Un client est toujours bloqué. À ce stade, nous exécutons
A à partir d'un autre client B et produisons
Remarque : s'il y a plusieurs clés après brpop, alors brpop parcourra les clés de gauche à droite. Une fois qu'il y a une clé, Pop l'élément et le client revient immédiatement.
Le type de liste peut être utilisé par exemple :
File d'attente de messages, la combinaison de commandes Redis lpush+brpop peut réaliser la file d'attente de blocage, le client producteur utilise lrpush pour insérer des éléments du côté gauche de la liste, plusieurs clients consommateurs En utilisant la commande brpop pour "saisir" les éléments en fin de liste de manière bloquante, plusieurs clients assurent l'équilibrage de charge et la haute disponibilité de la consommation.
Liste d'articles
Chaque utilisateur a sa propre liste d'articles, et maintenant la liste d'articles doit être affichée en pages. À l'heure actuelle, vous pouvez envisager d'utiliser une liste, car la liste est non seulement ordonnée, mais prend également en charge l'obtention d'éléments en fonction de la plage d'index.
Implémenter d'autres structures de données
lpush+lpop =Stack (pile)
lpush +rpop =Queue (file d'attente)
lpsh+ ltrim =Capped Collection (collection limitée)
lpush+brpop=Message Queue (file d'attente de messages)
Le type set est également utilisé pour enregistrer plusieurs éléments de chaîne, mais contrairement au type liste, les éléments en double ne sont pas autorisés dans l'ensemble et les éléments de l'ensemble ne sont aucun. Dans l'ordre, les éléments ne peuvent pas être obtenus via indices d'indexation.
Une collection peut stocker jusqu'à 2 puissance 32 - 1 élément. En plus de prendre en charge l'ajout, la suppression, la modification et les requêtes au sein d'une collection, Redis prend également en charge les ensembles d'intersection, d'union et de différence de plusieurs collections. Une utilisation appropriée des types de collection peut résoudre de nombreux problèmes pratiques dans le développement réel.
permet d'ajouter plusieurs éléments, le résultat de retour est le nombre d'éléments ajoutés avec succès
permet la suppression de plusieurs éléments, le résultat de retour est le nombre d'éléments supprimés avec succès
Si l'élément élément donné est dans l'ensemble, renvoie 1, sinon renvoie 0
Spécifiez le nombre S'il n'est pas écrit, la valeur par défaut est 1
.Vous pouvez également spécifier le numéro. S'il n'est pas spécifié, la valeur par défaut est 1. Notez que comme il s'agit d'un popping, une fois la commande spop exécutée, les éléments seront supprimés de la collection, mais srandmember ne le fera pas.
Le résultat renvoyé n'est pas ordonné
Maintenant, il y a deux ensembles, ils sont set1 et set2
sinterstore destination key [key ...] suionstore destination key [key ...] sdiffstore destination key [key ...]复制代码
Les opérations entre les ensembles prendront plus de temps lorsqu'il y a de nombreux éléments, donc Redis fournit les trois commandes ci-dessus (commande d'origine + magasin) pour enregistrer les résultats de l'intersection, de l'union et de la différence entre les ensembles dans la clé de destination, par exemple :
Un scénario d'utilisation typique pour les types de collections est celui des balises. Par exemple, un utilisateur peut être intéressé par le divertissement et le sport, tandis qu'un autre utilisateur peut être intéressé par l'histoire et l'actualité. Ces points d'intérêt sont des tags. Avec ces données, vous pouvez obtenir les personnes qui aiment la même balise et les balises que les utilisateurs aiment en commun. Ces données sont importantes pour l'expérience utilisateur et pour améliorer la fidélité de l'utilisateur.
Par exemple, un site de commerce électronique fera différents types de recommandations pour les utilisateurs avec des labels différents. Par exemple, pour les personnes plus intéressées par les produits numériques, les derniers produits numériques leur seront recommandés sur différentes pages ou via des e-mails. , généralement pour le site Web, apporte plus d'avantages.
De plus, les collections peuvent également générer des nombres aléatoires pour des activités telles que les activités de loterie, les graphiques sociaux, etc.
Les ensembles ordonnés sont un peu inconnus par rapport aux hachages, aux listes et aux ensembles, mais comme ils sont appelés ensembles ordonnés, ils doivent être liés à des ensembles et ils conservent Les ensembles ne peuvent pas avoir de membres en double , mais la différence est que les éléments d'un ensemble ordonné peuvent être triés. Mais contrairement à la liste qui utilise les indices d’index comme base de tri, elle définit un score pour chaque élément comme base de tri.
Les éléments de l'ensemble commandé ne peuvent pas être répétés, mais le score peut être répété, tout comme le nombre d'élèves des camarades de classe de la même classe ne peut pas être répété, mais les résultats des tests peuvent être les mêmes.
Les ensembles ordonnés fournissent des fonctions telles que l'obtention de scores spécifiés et de requêtes de plage d'éléments, le calcul du classement des membres, etc. Une utilisation appropriée des ensembles ordonnés peut nous aider à résoudre de nombreux problèmes dans le développement réel.
Le résultat renvoyé représente le nombre de membres ajoutés avec succès
Veuillez noter :
La commande zadd a également quatre options nx, xx, ch, incr quatre options
nx : le membre ne doit pas exister avant de pouvoir être défini avec succès pour l'ajout.
xx : le membre doit exister avant de pouvoir être défini avec succès et utilisé pour les mises à jour.
ch : Renvoie le nombre d'éléments et de scores de l'ensemble ordonné qui ont changé après cette opération
incr : Augmente le score, ce qui est équivalent au zincrby
Si le membre n'existe pas, retournez nul
zrank是从分数从低到高返回排名
zrevrank反之
很明显,排名从0开始计算。
允许一次删除多个成员。
返回结果为成功删除的个数。
有序集合是按照分值排名的,zrange是从低到高返回,zrevrange反之。如果加上 withscores选项,同时会返回成员的分数
zrangebyscore key min max [withscores] [limit offset count] zrevrangebyscore key max min [withscores][limit offset count]复制代码
其中zrangebyscore按照分数从低到高返回,zrevrangebyscore反之。例如下面操作从低到高返回200到221分的成员,withscores选项会同时返回每个成员的分数。
同时min和max还支持开区间(小括号)和闭区间(中括号),-inf和+inf分别代表无限小和无限大:
zcount key min max
zremrangebyrank key start end
zremrangebyscore key min max
zinterstore
这个命令参数较多,下面分别进行说明
destination:交集计算结果保存到这个键。
numkeys:需要做交集计算键的个数。
key [key ...]:需要做交集计算的键。
weights weight [weight ...]:每个键的权重,在做交集计算时,每个键中的每个member 会将自己分数乘以这个权重,每个键的权重默认是1。
aggregate sum/ min |max:计算成员交集后,分值可以按照sum(和)、min(最小值)、max(最大值)做汇总,默认值是sum。
不太好理解,我们用一个例子来说明。(算平均分)
该命令的所有参数和zinterstore是一致的,只不过是做并集计算,大家可以自行实验。
有序集合比较典型的使用场景就是排行榜系统。例如视频网站需要对用户上传的视频做排行榜,榜单的维度可能是多个方面的:按照时间、按照播放数量、按照获得的赞数。
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情
推荐学习: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!