


Analysons ensemble les problèmes de cohérence du cache Redis, de pénétration du cache, de panne de cache et d'avalanche de cache
Cet article vous apporte des connaissances pertinentes sur Redis, qui présente principalement les problèmes liés à la cohérence du cache, à la pénétration du cache, à la panne du cache, à l'avalanche de cache et à la synchronisation d'écriture des données mises en cache et à la cohérence de la base de données. Jetons-y un coup d'œil ensemble, je l'espère. sera utile à tout le monde.
Recommandations associées : "Analyse des problèmes de stockage des touches de raccourci dans Redis et discussion sur les solutions aux exceptions de cache"
(1) Problème de cohérence d'invalidation du cache
L'utilisation générale du cache est : Lire le cachez d'abord, s'il n'existe pas, lisez-le à partir de la base de données et écrivez le résultat dans le cache ; la prochaine fois que les données seront lues, les données pourront être obtenues directement à partir du cache. [Recommandation associée : Tutoriel vidéo Redis]
La modification des données consiste à invalider directement les données mises en cache, puis à modifier le contenu de la base de données pour éviter une modification réussie de la base de données, mais les données mises en cache ne sont pas nettoyées en raison de problèmes de réseau ou autres, ce qui entraîne données sales. Mais cela ne peut toujours pas éviter la génération de données sales. Dans un scénario simultané : supposons que l'entreprise ait un grand nombre de demandes de lecture et de modification pour les données Key:Hello Value:World. Le thread A lit Key:Hello from OCS, obtient le résultat Not Found, commence à demander des données à la base de données et obtient ensuite les données Key:Hello Value:World ; il se prépare ensuite à écrire ces données sur OCS, mais avant d'écrire sur OCS (réseau). , Attendre le CPU peut entraîner un ralentissement de la vitesse de traitement du thread A.) Un autre thread B demande de modifier les données Key:Hello Value:OCS et exécute d'abord l'action de cache d'invalidation (car le thread B ne sait pas si ces données existent , il effectue donc directement l'opération d'invalidation). OCS a traité avec succès la requête invalide. Revenez au thread A pour continuer à écrire OCS et écrivez Key:Hello Value:World dans le cache. La tâche du thread A se termine également avec succès par la modification du contenu des données de la base de données en Key:Hello Value:OCS. Afin de résoudre ce problème, OCS a étendu le protocole Memcached (le cloud public le supportera bientôt) et ajouté l'interface deleteAndIncVersion. Cette interface ne supprime pas réellement les données, mais étiquette les données pour indiquer qu'elles ont expiré et augmente le numéro de version des données. Si les données n'existent pas, NULL est écrit et un numéro de version aléatoire des données est également généré. L'écriture OCS prend en charge la comparaison atomique des numéros de version : en supposant que le numéro de version entrant est cohérent avec le numéro de version des données enregistré par OCS ou que les données d'origine n'existent pas, l'écriture est autorisée, sinon la modification est refusée.
Retour à la scène tout à l'heure : le fil de discussion A lit Key:Hello from OCS, obtient le résultat Not Found, commence à demander des données à la base de données et obtient les données Key:Hello Value:World, puis se prépare à écrire ces données dans OCS, Les informations sur le numéro de version sont par défaut 1 ; avant que A n'écrive dans OCS, un autre thread B lance une action pour modifier les données Key:Hello Value:OCS. Il exécute d'abord l'action de suppression du cache, OCS gère avec succès la requête deleteAndIncVersion et génère une version aléatoire. nombre de 12345 (convention supérieure à 1000). Revenez au thread A et continuez à écrire sur OCS, en demandant d'écrire Key:Hello Value:World. À ce stade, le système de cache constate que les informations sur le numéro de version entrant ne correspondent pas (1 ! = 12345), l'écriture échoue et le. La tâche du thread A se termine. Le thread B a également modifié avec succès le contenu des données de la base de données en Key:Hello Value:OCS.
À l'heure actuelle, les données dans OCS sont Key:Hello Value:NULL Version:12345 ; les données dans DB sont Key:Hello Value:OCS. Dans les tâches de lecture suivantes, les données dans DB seront réessayées d'écrire dans OCS. .
(2) Le problème de la synchronisation d'écriture des données mises en cache et de la cohérence de la base de données
À mesure que l'échelle du site Web augmente et que la fiabilité s'améliore, il sera confronté au déploiement de plusieurs IDC. Chaque IDC dispose d'une base de données et d'un système de cache indépendants. cette fois, la cohérence du cache est devenue un problème majeur.
Tout d'abord, afin de garantir une efficacité élevée, le système de cache empêchera les E/S sur le disque, même lors de l'écriture de BINLOG. Bien sûr, pour des raisons de performances, le système de cache ne peut supprimer que de manière synchrone et non écrire de manière synchrone, donc le cache la synchronisation aura généralement priorité sur l'arrivée de la synchronisation de la base de données (après tout, le système de cache L'efficacité est beaucoup plus élevée), alors il y aura un scénario où il n'y aura pas de données dans le cache et d'anciennes données dans la base de données. À ce stade, il y a une demande commerciale de données et le cache de lecture est introuvable. Les anciennes données lues à partir de la base de données et chargées dans le cache sont toujours des données anciennes. Lorsque la synchronisation des données de la base de données arrive, seule la base de données est mise à jour. et les données sales mises en cache ne peuvent pas être effacées.
Comme le montre la situation ci-dessus, la cause première de l'incohérence est que les systèmes hétérogènes ne peuvent pas se synchroniser de manière collaborative. Ils ne peuvent pas garantir que les données de la base de données soient synchronisées en premier et que les données mises en cache soient synchronisées ultérieurement. Nous devons donc considérer comment le système de cache attend la synchronisation de la base de données, ou les deux peuvent-ils partager un mécanisme de synchronisation ? La synchronisation du cache s'appuie également sur DB BINLOG qui est une solution réalisable.
La base de données dans IDC1 est synchronisée avec la base de données dans IDC2 via BINLOG. Dans ce cas, la modification des données IDC2-DB générera également son propre BINLOG. La synchronisation des données mises en cache peut être effectuée via IDC2-DB BINLOG. Une fois que le module de synchronisation du cache a analysé le BINLOG, il invalide la clé de cache correspondante et modifie la synchronisation de parallèle à série, garantissant ainsi l'ordre.
(3) Pénétration du cache (la base de données a subi un trafic de requêtes inutile)
Méthode 1 : C'est un filtre Bloom. Il s'agit d'un algorithme probabiliste et d'une structure de données extrêmement économes en espace, utilisés pour déterminer si un élément fait partie d'un ensemble (similaire à Hashset). Son noyau est un long vecteur binaire et une série de fonctions de hachage. Implémentez le filtre Bloom à l'aide de la goyave de Google. 1) Il existe un taux d'erreurs de calcul à mesure que le nombre d'éléments stockés augmente, le taux d'erreurs de calcul augmente également. 2) Dans des circonstances normales, les éléments ne peuvent pas être supprimés du filtre Bloom. 3) Le processus de détermination de la longueur du tableau et du nombre d'éléments. Les fonctions de hachage sont complexes et la distribution. Quels sont les scénarios d'utilisation du filtre Long ? 1) Filtrage des adresses spam (le nombre d'adresses est énorme) 2) Déduplication des adresses URL du robot 3) Résoudre le problème de panne de cache
Méthode 2 : stocker les résultats vides et définir l'heure des résultats vides
(4) Avalanche de cache ( Définir le cache sur le même délai d'expiration provoquera une inondation de base de données)
Méthode 1 : La plupart des concepteurs de systèmes envisagent d'utiliser des verrous ou des files d'attente pour garantir les écritures monothread (processus) dans le cache, évitant ainsi la chute d'un grand nombre de requêtes simultanées. lors d'une panne Sur le système de stockage sous-jacent
Méthode 2 : Délai d'expiration aléatoire
(5) Panne du cache (touche de raccourci, petite avalanche provoquée par un grand nombre de requêtes de lecture simultanées)
Lorsque le cache expire à un certain moment À ce stade, il y a un grand nombre de demandes simultanées pour cette clé. Lorsque ces demandes constatent que le cache a expiré, elles chargent généralement les données de la base de données backend et les réinitialisent dans le cache. À l'heure actuelle, des requêtes simultanées volumineuses peuvent instantanément submerger la base de données backend
Méthode 1 : 1. Utilisez la clé mutex (clé mutex) prise en charge par le cache de distribution pour définir une clé mutex. Lorsque l'opération est renvoyée avec succès, effectuez le chargement de la base de données. opération et réinitialiser le cache, c'est-à-dire qu'il n'y aura qu'un seul traitement de chargement DB Thread.
Méthode 2 : utilisez la clé mutex à l'avance : définissez une valeur de délai d'attente (timeout1) à l'intérieur de la valeur, timeout1 est plus petit que le délai d'expiration réel du cache mémoire (timeout2). Lorsque timeout1 est lu à partir du cache, il s'avère qu'il a expiré. Le moment venu, prolongez immédiatement le délai d'attente1 et réinitialisez-le dans le cache. Ensuite, chargez les données de la base de données et définissez-les dans le cache. Cela augmente l'intrusion du code métier et augmente la complexité du codage. : Du point de vue de Redis, il n'y a en effet pas de délai d'expiration, ce qui garantit qu'il n'y aura pas de problème d'expiration de clé de hotspot, c'est-à-dire qu'elle n'expirera pas "physiquement" d'un point de vue fonctionnel, si elle n'expire pas. , ne devient-il pas statique ? Nous stockons le délai d'expiration dans la valeur correspondant à la clé. S'il s'avère qu'elle est sur le point d'expirer, le cache est construit via un thread asynchrone en arrière-plan, ce qui est une expiration "logique"
. (6) Plénitude courante du cache et perte de données dans le système de cache Le problèmedoit être analysé en fonction d'une activité spécifique. Habituellement, nous utilisons la stratégie LRU pour gérer le débordement, et les stratégies de persistance RDB et AOF de Redis pour assurer la sécurité des données. dans certaines circonstances
Pour plus de connaissances sur la programmation, veuillez visiter :
Vidéo de 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!

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

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 !

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)

Sujets chauds

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

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.

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.

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)

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.

Dans Debian Systems, les appels du système ReadDir sont utilisés pour lire le contenu des répertoires. Si ses performances ne sont pas bonnes, essayez la stratégie d'optimisation suivante: simplifiez le nombre de fichiers d'annuaire: divisez les grands répertoires en plusieurs petits répertoires autant que possible, en réduisant le nombre d'éléments traités par appel ReadDir. Activer la mise en cache de contenu du répertoire: construire un mécanisme de cache, mettre à jour le cache régulièrement ou lorsque le contenu du répertoire change et réduire les appels fréquents à Readdir. Les caches de mémoire (telles que Memcached ou Redis) ou les caches locales (telles que les fichiers ou les bases de données) peuvent être prises en compte. Adoptez une structure de données efficace: si vous implémentez vous-même la traversée du répertoire, sélectionnez des structures de données plus efficaces (telles que les tables de hachage au lieu de la recherche linéaire) pour stocker et accéder aux informations du répertoire
