Voyons d'abord à quoi ressemble ce processus de mise en cache normal ? Comme le montre la figure ci-dessous :
Vous pouvez voir que d'abord l'utilisateur accède à ce quelque chose, puis que cette personne accède à ce Redis si Redis a les données d'accès, il renverra directement les données obtenues à partir du cache ; Si le cache Redis ne trouve pas les données, il interrogera la base de données MySql. S'il y a un résultat, les données récupérées de MySql seront synchronisées avec le cache Redis et le résultat de la requête sera renvoyé.
Il s'agit d'un processus de mise en cache simple et normal. Voyons donc quelle avalanche de cache est basée sur ce processus de mise en cache normal.
Tout d'abord, permettez-moi de vous donner un exemple. Pendant Double Eleven, lorsque vous achetez quelque chose à Dongdong, vous accédez à sa page d'accueil. Puisqu'il s'agit de Double Eleven, le nombre de visites sur la page d'accueil est très important, donc beaucoup. les données de la page d'accueil sont mises en cache dans Redis.
Supposons que les données de la page d'accueil soient stockées dans 100 clés dans Redis et que le délai d'expiration du cache soit fixé à deux heures. Pendant Double Eleven, après plus de deux heures d'achat, le cache Redis des données de la page d'accueil expirera à ce moment-là. À ce moment-là, la pression d'accès à la base de données augmente, ce qui fait que la base de données MySql ne répond pas à temps et raccroche. Par conséquent, la page d'accueil de Dong ne peut pas continuer à fournir. services au monde extérieur. Puis Dong Ge I était très mécontent et a envoyé le responsable technique en Afrique.
Donc à travers cet exemple, regardons l'image ci-dessous :
C'est-à-dire que lorsqu'un utilisateur accède à quelque chose, un grand nombre de clés dans redis sont invalides, ce qui fait que ce quelque chose accède directement à la base de données et fait un grand nombre de requêtes dans la base de données, ce phénomène est une avalanche de cache. Pour faire simple, un grand nombre de caches Redis sont invalidés en même temps, au moment même où cette avalanche arrive.
Alors quelles sont les solutions pour cacher les avalanches ? Parlons-en ci-dessous :
Définissez le délai d'expiration de ce cache pour éviter qu'un grand nombre de clés ne s'invalident en même temps. Autrement dit, lors de la configuration de ce cache, vous pouvez étaler le délai d'expiration des clés. .
Nous déployons généralement redis dans un cluster. Nous pouvons placer les clés de ces hotspots sur différents nœuds, afin que les clés de ces hotspots soient réparties uniformément sur différents nœuds redis.
Il existe également une méthode plus violente, qui consiste à ne pas définir le délai d'expiration du cache, afin que la clé n'expire jamais.
Ensuite, présentons ce qu'est la pénétration du cache.
Donnons un exemple : par exemple, un certain vieil homme a développé un site Web, et puis le site Web est devenu très populaire. Un jour, il a été soudainement attaqué par des pirates informatiques. Sa méthode d'attaque était basée sur le principe de la pénétration du cache.
Tout le monde sait qu'habituellement, la clé primaire de la base de données augmente à partir de 0 et qu'il n'y a pas de nombres négatifs. Ce hacker en a donc profité et a continué à envoyer des requêtes avec des paramètres avec un ID inférieur à zéro. Ce type a d'abord mis toutes les données du site Web dans le cache Redis, mais le pirate informatique a utilisé un numéro avec un identifiant inférieur à zéro pour le demander. Le cache Redis n'avait pas ces données avec un identifiant inférieur à zéro, donc Redis ne pouvait pas. Par conséquent, une fois que Redis ne trouve pas le résultat, il le vérifiera dans la base de données, puis toutes les requêtes seront envoyées à la base de données et seront toujours envoyées à la base de données, car la couche de cache Redis ne peut pas intercepter ces données. du tout.
Le cache Redis est directement pénétré par ces données, pénétrant directement dans la base de données. De même, regardons l'image ci-dessous :
Tout d'abord, l'utilisateur malveillant accède à quelque chose et demande les données avec id=-1. Ensuite, les données avec id=-1 ne sont pas trouvées dans le cache Redis, donc ça disparaît. à la base de données Lors de l'interrogation à l'intérieur, les données n'ont pas été trouvées, donc les données vides ne pouvaient être renvoyées qu'au front-end.
Cet utilisateur malveillant (hacker) utilise un script pour envoyer en continu ces données à la demande, pénétrant directement dans Redis et atteignant cette base de données. C'est ce qu'on appelle la pénétration du cache. Pour faire simple, la pénétration du cache signifie qu'il n'y a pas de telles données dans le cache ou la base de données. Généralement, cette situation n'est pas accessible aux utilisateurs normaux.
Ensuite, les solutions pour la pénétration du cache sont les suivantes :
Si la requête pénètre dans Redis et va directement dans la base de données, quel que soit le résultat trouvé dans la base de données, elle sera réécrite dans le cache Redis donc qu'il pourra être utilisé la prochaine fois. Lorsqu'une requête est envoyée avec le même paramètre, elle sera directement interceptée par le cache redis et ne sera pas renvoyée à la base de données.
Vérifiez la validité des paramètres demandés.
Une méthode plus directe, simple et grossière consiste à bloquer cette IP.
Enfin, utilisez un filtre bloom, ce qui est un très bon moyen.
Parlons du dernier problème, qui est la panne du cache.
Prenons l'exemple de Double Eleven : lors de Double Eleven, frère Dong a annoncé qu'il souhaitait organiser un grand événement et a déclaré qu'il souhaitait vendre aux enchères l'ordinateur qu'il utilisait il y a 20 ans. Ensuite, beaucoup de gens se sont intéressés à cet ordinateur. . Intéressé, Dong Ge a donc décidé de vendre cet ordinateur aux enchères à 9 heures sur Double Eleven. Ensuite, le programmeur de développement de Dong a mis les données informatiques dans le cache redis, ce qui correspond à une clé dans le cache redis.
Lors de l'enchère, tout le monde était très enthousiaste. L'enchère a duré près de trois heures. L'enchère en ligne n'est pas encore terminée, mais le délai d'expiration de la clé de cache redis correspondant à cet ordinateur est de trois heures et demie. Alors que tout le monde vendait aux enchères pendant trois heures et demie, la clé de cache de cet ordinateur est soudainement devenue invalide. En conséquence, le grand nombre de demandes d'enchères n'ont pas pu trouver les données dans Redis, donc ce grand nombre de demandes ont été directement adressées au système. base de données À ce moment, la base de données La pression instantanée augmente, ce qui empêche le système de répondre à temps et de raccrocher.
À cette époque, frère Dong était un peu en colère lorsqu'il a vu que son ordinateur n'avait pas encore été vendu aux enchères, alors il a envoyé le programmeur en Afrique.
De même, regardons également l'image suivante :
L'utilisateur visite un certain site Web, puis se rend sur redis pour demander une vente flash aux enchères. Lorsque le cache n'est pas invalide, redis peut renvoyer le résultat de. la clé de cache interrogée revient en arrière, mais lorsque la clé mise en cache expire, la requête pénètre dans le redis et atteint directement la base de données.
Ce à quoi tout le monde doit faire attention ici, c'est qu'il s'agit de la clé d'un certain hotspotUn grand nombre de demandes d'utilisateurs continuent d'accéder à la clé de ce hotspot. Lorsque la clé de ce hotspot échoue soudainement, toutes les demandes sont envoyées à. la base de données. Ce processus est appelé Dépannage du cache. N'oubliez pas que c'est la clé pour pénétrer dans un point très chaud.
Ensuite, la solution à cette panne de cache est la suivante :Ne laissez pas cette clé de hotspot expirer, c'est-à-dire ne définissez pas de délai d'expiration (non recommandé).
Utilisez des verrous distribués S'il s'agit d'une seule application, utilisez des verrous mutex (les verrous distribués seront abordés dans les articles suivants).
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!