Presque toutes les interviews liées à Java poseront des questions sur la mise en cache. Les plus basiques demanderont quelle est la « règle des 80/20 » et ce que sont les « données chaudes et les données froides ». Les plus compliqués poseront des questions sur l'avalanche de cache, la pénétration du cache, le préchauffage du cache, la mise à jour du cache, la rétrogradation du cache, etc. Ces concepts apparemment rares sont tous liés à notre serveur de cache couramment utilisé, notamment Redis et Memcached, etc. l'auteur utilise actuellement uniquement Redis.
Si vous n'avez jamais rencontré un intervieweur vous demandant lors d'entretiens précédents : "Pourquoi Redis est-il dit monothread et pourquoi Redis est-il si rapide !" 》, alors quand vous lisez cet article, vous devriez sentir que c'est une chose très chanceuse ! Si vous êtes un intervieweur de grande qualité, vous pouvez également utiliser cette question pour interviewer l'ami en face de vous qui « voit à travers l'eau » afin de tester sa maîtrise.
D'accord ! Allez droit au but ! Voyons d'abord ce qu'est Redis, pourquoi Redis est si rapide, puis discutons de pourquoi Redis est monothread ? [Recommandations associées : Tutoriel vidéo Redis]
1. Introduction à Redis
Redis est un système de stockage de structure de données en mémoire open source. Peut être utilisé comme : base de données, cache et middleware de messages.
Il prend en charge plusieurs types de structures de données, telles que les chaînes, les hachages, les listes, les ensembles, les ensembles triés ou les ZSet et les requêtes de plage, les bitmaps, les hyperloglogs et les requêtes de rayon d'index géospatial. Parmi eux, les cinq types de structure de données courants sont : String, List, Set, Hash et ZSet.
Redis a une réplication intégrée, des scripts LUA, une expulsion LRU, des transactions et différents niveaux de persistance du disque, et est implémenté via Redis Sentinel ) et le partitionnement automatique (Cluster) offre une haute disponibilité (Haute disponibilité).
Redis propose également des options de persistance, qui permettent aux utilisateurs de sauvegarder leurs données sur le disque pour les stocker. En fonction de la situation réelle, l'ensemble de données peut être exporté sur le disque (instantané) à certains intervalles, ou ajouté au journal des commandes (AOF ajoute uniquement les fichiers lors de l'exécution de la commande d'écriture, il copiera la commande d'écriture exécutée sur le disque). disque. Vous pouvez également désactiver la persistance et utiliser Redis comme fonction efficace de données de cache réseau.
Redis n'utilise pas de tables et sa base de données ne prédéfinit ni n'oblige les utilisateurs à associer différentes données stockées dans Redis.
Le mode de fonctionnement de la base de données peut être divisé en : base de données sur disque dur et base de données mémoire selon la méthode de stockage. Redis stocke les données en mémoire lors de la lecture et de l'écriture des données, elles ne sont pas limitées par la vitesse d'E/S du disque dur, elles sont donc extrêmement rapides.
(1) Mode de fonctionnement de la base de données du disque dur :
(2) Mode de fonctionnement de la base de données mémoire :
Après avoir lu la description ci-dessus, avez-vous une certaine compréhension de certaines questions d'entretien courantes liées à Redis, telles que : qu'est-ce que Redis, quels sont les types courants de structure de données de Redis, comment Redis persiste-t-il, etc.
2. Quelle est la vitesse de Redis ?
Redis utilise une base de données KV basée sur la mémoire qui adopte un modèle mono-processus et monothread. Elle est écrite en langage C. Les données officiellement fournies peuvent atteindre plus de 100 000 QPS (nombre de requêtes par seconde). ) ).
Ces données ne sont pas pires que Memcached, la même base de données KV basée sur la mémoire qui utilise un processus unique et du multi-threading !
L'axe horizontal est le nombre de connexions, et l'axe vertical est le QPS. À l'heure actuelle, cette image reflète un ordre de grandeur. J'espère que tout le monde pourra la décrire correctement lors de l'entretien. Ne posez pas votre réponse à un ordre de grandeur très différent !
3. Pourquoi Redis est-il si rapide ?
1. Entièrement basées sur la mémoire, la plupart des requêtes sont de pures opérations de mémoire, très rapides. Les données sont stockées en mémoire, comme HashMap. L'avantage de HashMap est que la complexité temporelle de la recherche et de l'opération est O(1)
2. simple. La structure des données dans Redis Il est spécialement conçu ; 3. Il utilise un seul thread pour éviter les changements de contexte inutiles et les conditions de concurrence. Il n'y a pas de commutation causée par le multi-processus ou le multi-threading pour consommer le. CPU, et il n'est pas nécessaire de prendre en compte divers verrous. Il n'y a pas de problème de verrouillage et de libération des verrous, et il n'y a pas de consommation de performances causée par d'éventuels blocages 4. , IO non bloquants ; 5. Les modèles sous-jacents utilisés sont différents, les méthodes d'implémentation sous-jacentes et les protocoles d'application pour la communication avec le client sont différents. Redis construit directement son propre mécanisme de VM, car si le système général est utilisé. appelle les fonctions système, cela fera perdre un certain temps aux mouvements et aux requêtes ;Les points ci-dessus sont relativement faciles à comprendre. Ci-dessous, nous discuterons brièvement du modèle de multiplexage d'E/S multicanal :
(1) Modèle de multiplexage d'E/S multicanal
Le modèle de multiplexage d'E/S multicanal utilise select, poll et epoll pour surveiller les événements d'E/S de plusieurs flux en même temps. Lorsqu'il est inactif, le thread actuel est bloqué lorsqu'un ou plusieurs flux ont des E/S. événements, /O événement, il se réveille de l'état de blocage, donc le programme interrogera tous les flux (epoll interroge uniquement les flux qui ont réellement émis l'événement) et ne traitera que les flux prêts dans l'ordre. Cette approche évite beaucoup de choses. d'opérations inutiles.
Ici, « multiple » fait référence à plusieurs connexions réseau, et « réutilisation » fait référence à la réutilisation du même fil.
L'utilisation de la technologie de multiplexage d'E/S multicanal permet à un seul thread de gérer efficacement plusieurs demandes de connexion (minimisant la consommation de temps des E/S du réseau), et Redis exploite les données en mémoire très rapidement, ce qui c'est-à-dire que les opérations en mémoire ne deviendront pas un goulot d'étranglement affectant les performances de Redis. Les points ci-dessus contribuent principalement au débit élevé de Redis.
4. Alors pourquoi Redis est-il monothread ?
Il faut d'abord comprendre que toutes les analyses ci-dessus visent à créer une atmosphère où Redis est rapide ! La FAQ officielle indique que, étant donné que Redis est une opération basée sur la mémoire, le processeur n'est pas le goulot d'étranglement de Redis. Le goulot d'étranglement de Redis est probablement la taille de la mémoire de la machine ou la bande passante du réseau. Étant donné que le monothreading est facile à mettre en œuvre et que le CPU ne deviendra pas un goulot d'étranglement, il est logique d'adopter une solution monothread (après tout, utiliser le multi-threading causera beaucoup de problèmes !).
Vous risquez de pleurer en voyant ça ! Je pensais qu'il y aurait des points techniques majeurs qui rendraient Redis si rapide en utilisant un seul thread, mais je ne m'attendais pas à une réponse officielle qui semblerait nous tromper ! Cependant, nous pouvons déjà expliquer clairement pourquoi Redis est si rapide, et précisément parce qu'il est déjà rapide en mode monothread, il n'est pas nécessaire d'utiliser le multi-threading !
Cependant, notre approche monothread ne peut pas tirer parti des performances du processeur multicœur, mais nous pouvons l'améliorer en ouvrant plusieurs instances Redis sur une seule machine !
Avertissement 1 : le thread unique que nous avons souligné ici n'a qu'un seul thread pour traiter nos requêtes réseau. Un serveur Redis formel doit avoir plus d'un thread lors de son exécution, ce qui est requis ici. Veuillez faire attention clairement ! Par exemple, lorsque Redis est persistant, il sera exécuté en tant que sous-processus ou sous-thread (le sous-thread ou sous-processus spécifique doit être étudié en profondeur par le lecteur, par exemple, j'ai vérifié le processus Redis) ; sur le serveur de test, puis trouvé le thread sous le processus :
Le paramètre "-T" de la commande ps indique Afficher les threads, éventuellement avec la colonne SPID. La colonne "SID" indique l'ID du thread et la colonne "CMD" affiche le nom du thread.
Avertissement 2 : Le dernier paragraphe de la FAQ dans l'image ci-dessus indique que le multi-threading sera pris en charge à partir de la version 4.0 de Redis. Cependant, les opérations multi-threading ne sont effectuées que sur certaines opérations ! Par conséquent, les lecteurs doivent vérifier si cet article sera toujours monothread dans les versions futures !
5. Notes
1. Nous savons que Redis utilise le « modèle IO multiplexé à un seul thread » pour implémenter des services de données mémoire hautes performances. l'utilisation de verrous, mais en même temps, ce mécanisme réduira la concurrence de redis lors de l'exécution de commandes fastidieuses telles que sunion.
Comme il s'agit d'un seul thread, il n'y a qu'une seule opération en cours en même temps. Par conséquent, les commandes chronophages entraîneront une diminution de la simultanéité, non seulement de la simultanéité de lecture, mais également de la simultanéité d'écriture. Un seul thread ne peut utiliser qu'un seul cœur de processeur, de sorte que plusieurs instances peuvent être démarrées sur le même serveur multicœur pour former un maître-maître ou un maître-esclave. Des commandes de lecture fastidieuses peuvent être entièrement exécutées sur l'esclave.
Éléments de Redis.conf qui doivent être modifiés :
pidfile /var/run/redis/redis_6377.pid #Pidfile doit ajouter le numéro de port
port 6377 #Ceci est requis Modifié
logfile /var/log/redis/redis_6377.log #Le nom du fichier journal ajoute également le numéro de port
dbfilename dump_6377.rdb #rdbfile ajoute également le numéro de port
2. "Nous ne pouvons pas laisser la charge du système d'exploitation équilibrer, car nous connaissons mieux nos propres programmes, nous pouvons donc leur allouer manuellement des cœurs de processeur sans trop occuper le processeur, ni laisser nos processus clés et un tas d'autres les processus sont encombrés. "
Le processeur est un facteur important. Puisqu'il s'agit d'un modèle monothread, Redis préfère un cache volumineux et un processeur rapide plutôt que multicœur.
Sur les serveurs CPU multicœurs, les performances de Redis dépendent également de la configuration NUMA et de la position de liaison du processeur. L'impact le plus évident est que Redis-benchmark utilise les cœurs de processeur de manière aléatoire. Pour des résultats précis, vous devez utiliser des outils de processeur fixes (sous Linux, vous pouvez utiliser l'ensemble de tâches). Le moyen le plus efficace consiste à séparer le client et le serveur en deux processeurs différents pour utiliser le cache de troisième niveau.
6. Extensions
Voici également plusieurs modèles que vous devriez connaître. Je vous souhaite un entretien réussi !
1. Modèle multithread à processus unique : MySQL, Memcached, Oracle (version Windows) ;
2. Modèle multi-processus : Oracle (version Linux)
3. Nginx a deux types de processus, l'un est appelé processus maître (équivalent au processus de gestion) ; le processus Worker (processus de travail réel). Il existe deux méthodes de démarrage :
(1) Démarrage d'un seul processus : à l'heure actuelle, il n'y a qu'un seul processus dans le système, qui joue à la fois le rôle de processus maître et de processus travailleur.
(2) Démarrage multi-processus : à l'heure actuelle, le système dispose d'un et d'un seul processus maître, et au moins un processus Worker fonctionne.
(3) Le processus Master effectue principalement un travail d'initialisation global et la gestion du traitement des événements Worker est effectuée dans le Worker ;
Pour plus de connaissances liées à la programmation, veuillez visiter : Introduction à la programmation ! !
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!