La boucle d'événements de Redis est traitée dans un thread. En tant que programme monothread, il est important de s'assurer que le délai de traitement des événements est court, afin que les tâches suivantes dans la boucle d'événements ne soient pas bloquées lorsque la quantité de ; Les données Redis atteignent Après un certain niveau (comme 20G), les opérations de blocage ont un impact particulièrement grave sur les performances
Nous résumons ci-dessous les scénarios chronophages dans redis et comment les gérer Méthode
Les commandes qui prennent beaucoup de temps provoquent le blocage des
clés, tri et autres commandes
La commande keys est utilisée pour rechercher tous les éléments correspondant à un modèle donné. La complexité temporelle de la clé du modèle est O(N) et N est le nombre de clés dans la base de données. Lorsque le nombre d'éléments dans la base de données atteint des dizaines de millions, cette commande entraînera le blocage des threads de lecture et d'écriture pendant plusieurs secondes ; des commandes similaires incluent des opérations telles que le tri par union ; exigences?
Solution :
Dans la conception architecturale, il y a une astuce de "détournement", qui consiste à séparer les demandes à traitement rapide et les demandes à traitement lent. le plus lent affectera le plus rapide, ce qui empêchera le plus rapide de se lever ; cela est très évident dans la conception de redis. Le traitement des événements d'E/S non bloquants redis et epoll peut être effectué dans un seul thread. , et les opérations fastidieuses telles que la persistance, la réécriture AOF et les données de synchronisation maître-esclave doivent être gérées par un processus distinct, afin de ne pas affecter la vitesse du processus lent de la même manière, car les opérations fastidieuses telles que les clés nécessitent ; pour être utilisé, nous pouvons les supprimer, par exemple en ouvrant un nœud esclave Redis séparé, en particulier pour les opérations fastidieuses telles que les clés et le tri. Ces requêtes ne sont généralement pas des entreprises en temps réel en ligne. Plus la requête est lente, plus elle est lente. c'est le cas. L'essentiel est de terminer la tâche, mais n'a aucun impact sur les tâches en ligne et qui consomment beaucoup de temps ;
la commande smembers est utilisée pour. obtenir l'ensemble complet, avec une complexité temporelle de O(N) , N est le nombre dans la collection ; si des dizaines de millions de données sont stockées dans une collection, une récupération entraînera également le blocage du thread de traitement des événements pendant une longue période ; time;
Solution :
Contrairement aux commandes telles que sort et key, smembers peut être une commande très fréquemment utilisée dans les scénarios d'application en temps réel en ligne. ici.Nous devons le considérer davantage au niveau de la conception ;Pendant la conception, nous pouvons contrôler le nombre d'ensembles et généralement maintenir le nombre d'ensembles à moins de 500. Par exemple, une clé est utilisée pour stocker les enregistrements pendant un an. la quantité de données est importante. Nous pouvons utiliser 12 clés pour stocker des enregistrements pendant 12 mois, ou 365 clés pour enregistrer des enregistrements pour chaque jour, et contrôler la taille de la collection dans une plage acceptable ; n'est pas facile de diviser la collection en plusieurs sous-collections, mais insistez pour utiliser une grande collection pour stocker, vous pouvez alors envisager d'utiliser la clé SRANDMEMBER [count] lors de la récupération de l'ensemble, qui renvoie aléatoirement le numéro spécifié dans l'ensemble ; si vous souhaitez parcourir tous les éléments de l'ensemble, cette commande ne convient pas ;
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!