Pourquoi Redis est-il si rapide en utilisant un seul thread ?
Pourquoi Redis utilise-t-il un seul thread ?
La surcharge du multi-threading
S'il n'y a pas de bonne conception du système, l'utilisation du multi-threading conduira généralement aux résultats affichés à droite (notez l'ordonnée ). Lorsque vous augmentez pour la première fois le nombre de threads, le débit du système augmente. Lorsque vous augmentez encore le nombre de threads, le débit du système augmente lentement, voire diminue.
Le principal goulot d'étranglement est le suivant : il existe généralement des ressources partagées auxquelles plusieurs threads accèdent en même temps dans le système afin de garantir l'exactitude. des ressources partagées, il est nécessaire de disposer de mécanismes supplémentaires pour garantir la sécurité des threads, tels que le verrouillage, qui entraîneront une surcharge supplémentaire.
Prenons l'exemple du type List
le plus couramment utilisé. Supposons que Redis adopte une conception multithread et qu'il existe deux threads A et B qui gèrent List.
respectivement pour effectuer les opérations LPUSH
et LPUSH
, afin d'obtenir le même résultat à chaque fois, c'est-à-dire que [le thread B retire les données mises par A. thread], ces deux processus doivent être exécutés en série. Il s’agit du problème de contrôle d’accès simultané aux ressources partagées auquel est confronté le modèle de programmation multithread. List
类型来举例吧,假设Redis采用多线程设计,有两个线程A和B分别对List
做LPUSH
和LPUSH
操作,为了使得每次执行都是相同的结果,即【B线程取出A线程放入的数据】就需要让这两个过程串行执行。这就是多线程编程模式面临的共享资源的并发访问控制问题。
并发访问控制一直是多线程开发中的一个难点问题:如果只是简单地采用一个互斥锁,就会出现即使增加了线程,大部分线程也在等待获取互斥锁,并行变串行,系统吞吐率并没有随着线程的增加而增加。
同时加入并发访问控制后也会降低系统代码的可读性和可维护性,所以Redis干脆直接采用了单线程模式。
Pourquoi Redis est-il si rapide en utilisant un seul thread ??
之所以使用单线程是Redis设计者多方面衡量的结果。
Redis的大部分操作在内存上完成
采用了高效的数据结构,例如哈希表和跳表
采用了多路复用机制,使其在网络IO操作中能并发处理大量的客户端请求,实现高吞吐率
既然Redis使用单线程进行IO,如果线程被阻塞了就无法进行多路复用了,所以不难想象,Redis肯定还针对网络和IO操作的潜在阻塞点进行了设计。
网络与IO操作的潜在阻塞点
在网络通信里,服务器为了处理一个Get请求,需要监听客户端请求(bind/listen
),和客户端建立连接(accept
),从socket中读取请求(recv
),解析客户端发送请求(parse
),最后给客户端返回结果(send
)。
最基本的一种单线程实现是依次执行上面的操作。
上面标红的accept和recv操作都是潜在的阻塞点:
当Redis监听到有连接请求,但却一直不能成功建立起连接时,就会阻塞在
accept()
函数这里,其他客户端此时也无法和Redis建立连接当Redis通过
recv()
从一个客户端读取数据时,如果数据一直没有到达,也会一直阻塞
基于多路复用的高性能IO模型
为了解决IO中的阻塞问题,Redis采用了Linux的IO多路复用机制,该机制允许内核中,同时存在多个监听套接字和已连接套接字(select/epoll
)。
内核会一直监听这些套接字上的连接或数据请求。Redis会处理到达的请求,从而实现了一个线程处理多个IO流的效果。
此时,Redis线程就不会阻塞在某一个特定的客户端请求处理上,所以它可以同时和多个客户端连接并处理请求。
回调机制
select/epoll一旦监测到FD上有请求到达时,就会触发相应的事件被放进一个队列里,Redis线程对该事件队列不断进行处理,所以就实现了基于事件的回调。
例如,Redis会对Accept和Read事件注册accept
和get
回调函数。当Linux内核监听到有连接请求或读数据请求时,就会触发Accept事件和Read事件,此时,内核就会回调Redis相应的accept
和get

- #🎜🎜#La plupart des opérations de Redis sont effectuées en mémoire #🎜🎜#
- #🎜🎜# adopte des structures de données efficaces , tels que les tables de hachage et les tables de saut #🎜🎜#
- #🎜🎜# adoptent un mécanisme de multiplexage pour lui permettre de gérer simultanément un grand nombre de requêtes client dans les opérations d'E/S réseau. # #🎜🎜##🎜🎜#Étant donné que Redis utilise un seul thread pour les E/S, si le thread est bloqué, le multiplexage ne peut pas être effectué, il n'est donc pas difficile d'imaginer que Redis doit toujours être conçu pour des points d'étranglement potentiels dans les opérations réseau et IO. #🎜🎜##🎜🎜#Points de blocage potentiels des opérations réseau et IO#🎜🎜##🎜🎜#Dans la communication réseau, afin de traiter une requête Get, le serveur doit écouter la requête du client (
- #🎜🎜#Quand Redis écoute Quand il y a une demande de connexion mais la connexion ne peut pas être établie avec succès, elle sera bloquée dans la fonction
accept()
et les autres clients ne pourront pas établir de connexion avec Redis pour le moment #🎜🎜 # - #🎜🎜#Lorsque Redis lit les données d'un client via
recv()
, si les données ne sont pas arrivées, il bloquera toujours #🎜🎜# #🎜 🎜##🎜🎜#Modèle IO hautes performances basé sur le multiplexage#🎜🎜##🎜🎜#Afin de résoudre le problème de blocage dans IO, Redis adopte le mécanisme de multiplexage IO de Linux, qui permet au noyau d'avoir plusieurs prises d'écoute et prises connectées en même temps ( Pourquoi utiliser Redis N'est-ce pas mauvais d'accéder directement à la mémoire ?
Que dois-je faire s'il y a trop de données qui ne peuvent pas être stockées dans la mémoire ? Par exemple, si je souhaite mettre en cache 100 Go de données, que dois-je faire ?
bind /listen code>), établir une connexion avec le client (<code>accept
), lire la requête depuis le socket (recv
) et analyser la requête envoyée par le client (parse
>), et renvoie enfin le résultat au client (send
). #🎜🎜##🎜🎜#L'implémentation monothread la plus basique consiste à effectuer les opérations ci-dessus dans l'ordre. #🎜🎜##🎜🎜#
select/epoll
). #🎜🎜##🎜🎜#Le noyau écoutera toujours les connexions ou les demandes de données sur ces sockets. Redis traitera les requêtes entrantes, obtenant ainsi l'effet d'un thread traitant plusieurs flux d'E/S. #🎜🎜##🎜🎜#
accept
et get
pour les événements Accept et Read. Lorsque le noyau Linux surveille une demande de connexion ou une demande de lecture de données, il déclenchera l'événement Accept et l'événement Read. À ce moment, le noyau rappellera les accept
et get correspondants. code> de la fonction Redis à traiter. #🎜🎜##🎜🎜#Les goulots d'étranglement des performances de Redis#🎜🎜##🎜🎜#Après l'analyse ci-dessus, bien que plusieurs demandes de clients puissent être surveillées en même temps via le mécanisme de multiplexage, Redis présente encore des goulots d'étranglement de performances , c'est aussi une situation que nous devons éviter dans notre programmation quotidienne. #🎜🎜#<h4 id="Opérations-chronophages">1. Opérations chronophages</h4>
<p>Si une requête prend beaucoup de temps dans Redis, cela aura un impact sur les performances de l'ensemble du serveur. Les demandes suivantes doivent attendre que la demande précédente, qui prend beaucoup de temps, soit traitée avant de pouvoir être traitées. </p>
<p>Cela doit être évité lors de la conception de scénarios commerciaux ; le mécanisme <code>lazy-free
de Redis place également l'opération fastidieuse de libération de mémoire dans un thread asynchrone pour l'exécution.
2. Scénario de concurrence élevée
Lorsque le degré de concurrence est très important, il existe un goulot d'étranglement dans les performances de lecture et d'écriture des données d'E/S client avec un seul thread. Bien que le mécanisme de multiplexage d'E/S soit utilisé, il ne peut toujours lire que le client. données séquentiellement avec un seul thread et ne peut pas tirer parti de plusieurs cœurs de processeur.
Redis dans 6.0 peut utiliser le processeur multicœur et multithread pour lire et écrire les données client, mais seules la lecture et l'écriture pour le client sont parallèles et le fonctionnement réel de chaque commande est toujours monothread.
Autres questions intéressantes liées à Redis
J'aimerais profiter de cette occasion pour poser quelques questions intéressantes liées à Redis.
En fait, cet article n'est pas clairement défini. Pour certaines données qui ne changent pas fréquemment, elles peuvent être placées directement dans la mémoire. Il peut y avoir des problèmes de cohérence lors de la mise à jour des données, c'est-à-dire que les données d'un seul serveur peuvent être modifiées, de sorte que les données n'existent que dans la mémoire locale. L'accès au serveur Redis peut résoudre le problème de cohérence, en utilisant Redis.
Il y a aussi une publicité ici. Tair est le système de cache KV distribué open source de Taobao. Il hérite des opérations riches de Redis. Théoriquement, le volume total de données est illimité. Mettez à niveau, les amis intéressés peuvent le découvrir ~
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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

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

Pour afficher toutes les touches dans Redis, il existe trois façons: utilisez la commande Keys pour retourner toutes les clés qui correspondent au modèle spécifié; Utilisez la commande SCAN pour itérer les touches et renvoyez un ensemble de clés; Utilisez la commande info pour obtenir le nombre total de clés.

Redis utilise des tables de hachage pour stocker les données et prend en charge les structures de données telles que les chaînes, les listes, les tables de hachage, les collections et les collections ordonnées. Redis persiste les données via des instantanés (RDB) et ajoutez les mécanismes d'écriture uniquement (AOF). Redis utilise la réplication maître-esclave pour améliorer la disponibilité des données. Redis utilise une boucle d'événement unique pour gérer les connexions et les commandes pour assurer l'atomicité et la cohérence des données. Redis définit le temps d'expiration de la clé et utilise le mécanisme de suppression paresseux pour supprimer la clé d'expiration.

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).

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.

Redis Counter est un mécanisme qui utilise le stockage de la paire de valeurs de clés Redis pour implémenter les opérations de comptage, y compris les étapes suivantes: création de clés de comptoir, augmentation du nombre, diminution du nombre, réinitialisation du nombre et objet de comptes. Les avantages des compteurs Redis comprennent une vitesse rapide, une concurrence élevée, une durabilité et une simplicité et une facilité d'utilisation. Il peut être utilisé dans des scénarios tels que le comptage d'accès aux utilisateurs, le suivi des métriques en temps réel, les scores de jeu et les classements et le comptage de traitement des commandes.

Les étapes pour démarrer un serveur Redis incluent: Installez Redis en fonction du système d'exploitation. Démarrez le service Redis via Redis-Server (Linux / MacOS) ou Redis-Server.exe (Windows). Utilisez la commande redis-Cli Ping (Linux / MacOS) ou redis-Cli.exe Ping (Windows) pour vérifier l'état du service. Utilisez un client redis, tel que redis-cli, python ou node.js pour accéder au serveur.

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.
