Maison base de données Redis Pourquoi dit-on que Redis est monothread ?

Pourquoi dit-on que Redis est monothread ?

Jan 11, 2021 am 09:31 AM
redis fil unique

Pourquoi dit-on que Redis est monothread ?

Redis est un service de dictionnaire distant. Il s'agit d'une base de données de valeurs-clés de type journal open source écrite en langage ANSI C, prend en charge le réseau, peut être basée sur la mémoire et persistante, et fournit API multilingue.

(Partage vidéo d'apprentissage : Tutoriel vidéo Redis)

Processeur d'événements de fichiers

Redis a développé un processeur d'événements réseau basé sur le mode Reactor. traitement Le gestionnaire est appelé gestionnaire d'événements de fichier. Sa structure est composée de 4 parties : plusieurs sockets, un multiplexeur IO, un répartiteur d'événements de fichiers et un processeur d'événements. Étant donné que la consommation de la file d'attente du répartiteur d'événements de fichier est monothread, Redis est appelé un modèle monothread.

Pourquoi dit-on que Redis est monothread ?

Flux de traitement des messages

Le gestionnaire d'événements de fichier utilise des procédures de multiplexage d'E/S (multiplexage) pour écouter plusieurs sockets en même temps, et différents événements les gestionnaires sont associés au socket en fonction de la tâche qu'il exécute actuellement.

Lorsque le socket surveillé est prêt à effectuer des opérations telles que la réponse de connexion (accepter), la lecture (lecture), l'écriture (écriture), la fermeture (fermeture), etc., l'événement de fichier correspondant à l'opération sera se produisent, le gestionnaire d'événements de fichier appellera le gestionnaire d'événements précédemment associé au socket pour gérer ces événements.

Bien que plusieurs événements de fichier puissent se produire simultanément, le multiplexeur d'E/S poussera toujours toutes les sockets génératrices d'événements dans une file d'attente, puis passera par cette file d'attente pour envoyer les sockets au répartiteur d'événements de fichier de manière séquentielle, synchrone, une socket à la fois : après le traitement de l'événement généré par le socket précédent (le socket est l'objet de l'événement) (le gestionnaire d'événements associé est exécuté), et le multiplexeur d'E/S continuera à envoyer le socket suivant à l'événement de fichier répartiteur.

Implémentation du multiplexeur d'E/S

Toutes les fonctions du multiplexeur d'E/S de Redis sont regroupées en sélectionnant, epoll, evport et kqueue. Il est implémenté par la bibliothèque de fonctions de multiplexage. La bibliothèque correspond à un fichier distinct dans le code source Redis, tel que ae_select.c, ae_epoll.c, ae_kqueue.c, etc.

Étant donné que Redis implémente la même API pour chaque bibliothèque de fonctions de multiplexage d'E/S, l'implémentation sous-jacente du programme de multiplexage d'E/S est interchangeable, comme le montre la figure ci-dessous.

Pourquoi dit-on que Redis est monothread ?

Pour une explication détaillée d'epoll, vous pouvez cliquer pour voir et comprendre en profondeur le principe de fonctionnement efficace d'epoll

Redis dans le programme de multiplexage d'E/S La macro #include est utilisée pour définir les règles correspondantes dans le code source d'implémentation. Le programme sélectionnera automatiquement la bibliothèque de fonctions de multiplexage d'E/S la plus performante du système lors de la compilation comme implémentation sous-jacente du programme de multiplexage d'E/S de Redis :<.>

/* Include the best multiplexing layer supported by this system.
 * The following should be ordered by performances, descending. */
#ifdef HAVE_EVPORT
#include "ae_evport.c"
#else
    #ifdef HAVE_EPOLL
    #include "ae_epoll.c"
    #else
        #ifdef HAVE_KQUEUE
        #include "ae_kqueue.c"
        #else
        #include "ae_select.c"
        #endif
    #endif
#endif
Copier après la connexion

Types d'événements de fichiers

Le multiplexeur d'E/S peut écouter l'événement ae.h/AE_READABLE et l'événement ae.h/AE_WRITABLE de plusieurs sockets. La correspondance entre les événements de classe et les opérations de socket est. comme suit :

Lorsque le socket devient lisible (le client effectue une opération d'écriture sur le socket, ou effectue une opération de fermeture), ou il y a un nouveau Lorsqu'un socket acceptable apparaît (le client effectue une opération de connexion sur socket d'écoute du serveur), la socket génère un événement AE_READABLE.

Lorsque le socket devient accessible en écriture (le client effectue une opération de lecture sur le socket), le socket génère l'événement AE_WRITABLE. Le multiplexeur d'E/S permet au serveur d'écouter l'événement AE_READABLE et l'événement AE_WRITABLE du socket en même temps. Si un socket génère les deux événements en même temps, le répartiteur d'événements de fichier donnera la priorité à l'événement AE_READABLE et attendra le résultat. L'événement AE_READABLE est traité. Après cela, gérez l'événement AE_WRITABLE. Cela signifie que si un socket est à la fois lisible et inscriptible, le serveur lira d'abord à partir du socket, puis écrira sur le socket.

Processeurs pour les événements de fichiers

Redis a écrit plusieurs processeurs pour les événements de fichiers. Ces processeurs d'événements sont utilisés pour implémenter différentes exigences de communication réseau :

. Afin de répondre à chaque client connecté au serveur, le serveur doit associer un gestionnaire de réponse de connexion au socket d'écoute.

Afin de recevoir la demande de commande du client, le serveur doit associer le gestionnaire de demande de commande au socket client.

Afin de renvoyer le résultat de l'exécution de la commande au client, le serveur doit associer le gestionnaire de réponse de commande au socket client.

Processeur de réponse de connexion

La fonction acceptTcpHandler dans networking.c est le processeur de réponse de connexion de Redis. Ce processeur est utilisé pour répondre au client qui se connecte au socket d'écoute du serveur. est le suivant Un wrapper pour la fonction sys/socket.h/accept.

Lors de l'initialisation du serveur Redis, le programme associera ce processeur de réponse de connexion à l'événement AE_READABLE du socket d'écoute du serveur Lorsqu'un client utilise la fonction sys/socket.h/connect pour se connecter au socket d'écoute du serveur Quand, le socket générera un événement AE_READABLE, déclenchant l'exécution du processeur de réponse de connexion et effectuera l'opération de réponse de socket correspondante, comme indiqué dans la figure.

Pourquoi dit-on que Redis est monothread ?

Processeur de demande de commande

La fonction readQueryFromClient dans networking.c est le processeur de demande de commande de Redis. Ce processeur est responsable de la lecture à partir du socket. le contenu de la demande de commande envoyée par le client est spécifiquement implémenté en tant que wrapper de la fonction unistd.h/read.

Lorsqu'un client se connecte avec succès au serveur via le processeur de réponse de connexion, le serveur associera l'événement AE_READABLE du socket client au processeur de demande de commande lorsque le client envoie une demande de commande au serveur, le socket. générera un événement AE_READABLE, déclenchant l'exécution du processeur de demande de commande et effectuera l'opération de lecture de socket correspondante, comme indiqué dans la figure.

Pourquoi dit-on que Redis est monothread ?

Pendant tout le processus de connexion du client au serveur, le serveur associera toujours des processeurs de requêtes de commande pour l'événement AE_READABLE du socket client.

Processeur de réponse de commande

La fonction sendReplyToClient dans networking.c est le processeur de réponse de commande de Redis. Ce processeur est chargé de renvoyer la réponse de commande obtenue par le serveur après l'exécution de la commande au client. via l'extrémité du socket, qui est spécifiquement implémentée en tant que wrapper pour la fonction unistd.h/write.

Lorsque le serveur a une réponse de commande qui doit être envoyée au client, le serveur associera l'événement AE_WRITABLE du socket client au processeur de réponse de commande lorsque le client est prêt à recevoir la réponse de commande de. le serveur, l'événement AE_WRITABLE sera généré, déclenchant l'exécution du processeur de réponse de commande et effectuant l'opération d'écriture de socket correspondante, comme le montre la figure.

Pourquoi dit-on que Redis est monothread ?

Une fois la réponse de commande envoyée, le serveur dissociera le gestionnaire de réponse de commande de l'événement AE_WRITABLE du socket client.

Un exemple complet d'événement de connexion client-serveur

En supposant que le serveur Redis est en cours d'exécution, alors l'événement AE_READABLE du socket d'écoute de ce serveur doit être dans l'état d'écoute, et cet événement Le le processeur correspondant est le processeur de réponse de connexion.

Si un client Redis initie une connexion au serveur Redis à ce moment-là, le socket d'écoute générera un événement AE_READABLE, déclenchant l'exécution du processeur de réponse de connexion : le processeur répondra à la demande de connexion du client, puis create Le socket client, ainsi que l'état du client, et associe l'événement AE_READABLE du socket client au processeur de demande de commande afin que le client puisse envoyer une demande de commande au serveur principal.

Après cela, le client envoie une requête de commande au serveur Redis, puis le socket client générera un événement AE_READABLE, déclenchant l'exécution du processeur de requête de commande. Le processeur lit le contenu de la commande du client puis le transmet. au programme concerné à exécuter.

L'exécution des commandes générera les réponses de commande correspondantes. Afin de transmettre ces réponses de commande au client, le serveur associera l'événement AE_WRITABLE du socket client au gestionnaire de réponse de commande : lorsque le client tente de lire When. la commande répond, le socket client générera un événement AE_WRITABLE, déclenchant l'exécution du processeur de réponse de commande écrit toutes les réponses de commande sur le socket, le serveur libérera l'AE_WRITABLE du socket client Association entre les événements. et les gestionnaires de réponse aux commandes.

Pourquoi dit-on que Redis est monothread ?

Recommandations associées : Tutoriel sur la base 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!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment construire le mode Cluster Redis Comment construire le mode Cluster Redis Apr 10, 2025 pm 10:15 PM

Le mode Redis Cluster déploie les instances Redis sur plusieurs serveurs grâce à la rupture, à l'amélioration de l'évolutivité et de la disponibilité. Les étapes de construction sont les suivantes: Créez des instances de redis étranges avec différents ports; Créer 3 instances Sentinel, Moniteur Redis Instances et basculement; Configurer les fichiers de configuration Sentinel, ajouter des informations d'instance Redis de surveillance et des paramètres de basculement; Configurer les fichiers de configuration d'instance Redis, activer le mode de cluster et spécifier le chemin du fichier d'informations de cluster; Créer un fichier nœuds.conf, contenant des informations de chaque instance redis; Démarrez le cluster, exécutez la commande CREATE pour créer un cluster et spécifiez le nombre de répliques; Connectez-vous au cluster pour exécuter la commande d'informations de cluster pour vérifier l'état du cluster; faire

Comment effacer les données redis Comment effacer les données redis Apr 10, 2025 pm 10:06 PM

Comment effacer les données Redis: utilisez la commande flushall pour effacer toutes les valeurs de clé. Utilisez la commande flushdb pour effacer la valeur clé de la base de données actuellement sélectionnée. Utilisez SELECT pour commuter les bases de données, puis utilisez FlushDB pour effacer plusieurs bases de données. Utilisez la commande del pour supprimer une clé spécifique. Utilisez l'outil Redis-CLI pour effacer les données.

Comment lire la file d'attente redis Comment lire la file d'attente redis Apr 10, 2025 pm 10:12 PM

Pour lire une file d'attente à partir de Redis, vous devez obtenir le nom de la file d'attente, lire les éléments à l'aide de la commande LPOP et traiter la file d'attente vide. Les étapes spécifiques sont les suivantes: Obtenez le nom de la file d'attente: Nommez-le avec le préfixe de "Fitre:" tel que "Fitre: My-Quyue". Utilisez la commande LPOP: éjectez l'élément de la tête de la file d'attente et renvoyez sa valeur, telle que la file d'attente LPOP: My-Queue. Traitement des files d'attente vides: si la file d'attente est vide, LPOP renvoie NIL et vous pouvez vérifier si la file d'attente existe avant de lire l'élément.

Comment utiliser Redis Lock Comment utiliser Redis Lock Apr 10, 2025 pm 08:39 PM

L'utilisation des opérations Redis pour verrouiller nécessite l'obtention du verrouillage via la commande setnx, puis en utilisant la commande Expire pour définir le temps d'expiration. Les étapes spécifiques sont les suivantes: (1) Utilisez la commande setnx pour essayer de définir une paire de valeurs de clé; (2) Utilisez la commande Expire pour définir le temps d'expiration du verrou; (3) Utilisez la commande del pour supprimer le verrouillage lorsque le verrouillage n'est plus nécessaire.

Comment utiliser la commande redis Comment utiliser la commande redis Apr 10, 2025 pm 08:45 PM

L'utilisation de la directive Redis nécessite les étapes suivantes: Ouvrez le client Redis. Entrez la commande (Verbe Key Value). Fournit les paramètres requis (varie de l'instruction à l'instruction). Appuyez sur Entrée pour exécuter la commande. Redis renvoie une réponse indiquant le résultat de l'opération (généralement OK ou -err).

Comment lire le code source de Redis Comment lire le code source de Redis Apr 10, 2025 pm 08:27 PM

La meilleure façon de comprendre le code source redis est d'aller étape par étape: familiarisez-vous avec les bases de Redis. Sélectionnez un module ou une fonction spécifique comme point de départ. Commencez par le point d'entrée du module ou de la fonction et affichez le code ligne par ligne. Affichez le code via la chaîne d'appel de fonction. Familiez les structures de données sous-jacentes utilisées par Redis. Identifiez l'algorithme utilisé par Redis.

Comment utiliser la ligne de commande redis Comment utiliser la ligne de commande redis Apr 10, 2025 pm 10:18 PM

Utilisez l'outil de ligne de commande redis (Redis-CLI) pour gérer et utiliser Redis via les étapes suivantes: Connectez-vous au serveur, spécifiez l'adresse et le port. Envoyez des commandes au serveur à l'aide du nom et des paramètres de commande. Utilisez la commande d'aide pour afficher les informations d'aide pour une commande spécifique. Utilisez la commande QUIT pour quitter l'outil de ligne de commande.

Comment configurer le temps d'exécution du script LUA dans Centos Redis Comment configurer le temps d'exécution du script LUA dans Centos Redis Apr 14, 2025 pm 02:12 PM

Sur CentOS Systems, vous pouvez limiter le temps d'exécution des scripts LUA en modifiant les fichiers de configuration Redis ou en utilisant des commandes Redis pour empêcher les scripts malveillants de consommer trop de ressources. Méthode 1: Modifiez le fichier de configuration Redis et localisez le fichier de configuration Redis: le fichier de configuration redis est généralement situé dans /etc/redis/redis.conf. Edit Fichier de configuration: Ouvrez le fichier de configuration à l'aide d'un éditeur de texte (tel que VI ou NANO): Sudovi / etc / redis / redis.conf Définissez le délai d'exécution du script LUA: Ajouter ou modifier les lignes suivantes dans le fichier de configuration pour définir le temps d'exécution maximal du script LUA (unité: millisecondes)

See all articles