Cet article vous apporte des connaissances pertinentes sur Redis Il présente principalement les problèmes liés à la façon d'assurer la cohérence du cache Redis et de la base de données, y compris la mise à jour du cache et la mise à jour de la base de données, etc. .
Apprentissage recommandé : Tutoriel d'apprentissage Redis
Pour garantir la double écriture du cache et de la base de données, il existe 4 manières, soit 4 stratégies de synchronisation :
Parmi ces 4 stratégies de synchronisation, ce que nous devons comparer est :
Quelle méthode est la plus adaptée pour mettre à jour le cache ou supprimer le cache ? La base de données doit-elle être exploitée en premier ou le cache en premier ?
Ensuite, analysons si nous devons mettre à jour le cache ou supprimer le cache.
Avantages :Le cache est mis à jour à temps à chaque fois que les données changent, de sorte que des échecs sont moins susceptibles de se produire lors des requêtes.
Inconvénients : La mise à jour du cache est relativement coûteuse. Si les données doivent subir des calculs complexes avant d'être écrites dans le cache, les mises à jour fréquentes du cache affecteront les performances du serveur. S'il s'agit d'un scénario commercial dans lequel les données sont écrites fréquemment, il se peut qu'aucune entreprise ne lise les données lorsque le cache est fréquemment mis à jour.
Avantages :Opération simple, que l'opération de mise à jour soit compliquée ou non, les données du cache seront directement supprimées.
Inconvénients : Après la suppression du cache, le prochain cache de requêtes manquera et la base de données devra être relue. D’après la comparaison ci-dessus, en général, la suppression du cache est une meilleure solution.
échec
:
3.1 Supprimez d'abord le cache, puis mettez à jour la base de données出现失败
时进行一个对比:
如上图,是先删除缓存再更新数据库,在出现失败时可能出现的问题:
如上图,是先更新数据库再删除缓存,在出现失败
时可能出现的问题:
经过上面的比较,我们发现在出现失败
的时候,是无法明确分辨出先删缓存和先更新数据库哪个方式更好,以为它们都存在问题。后面我们会进一步对这两种方式进行比较,但是在这里我们先探讨一下,上述场景出现的问题,应该如何解决呢?
实际上,无论上面我们采用哪种方式去同步缓存与数据库,在第二步出现失败的时候,都建议采用重试机制解决,上面两幅图中已经画了。
下面我们再将先删缓存与先更新数据库,在没有出现失败时
进行对比:
如上图,是先删除缓存再更新数据库,在没有出现失败时
un échec se produit
Problèmes possibles : 🎜échoue
, il est impossible de distinguer clairement quelle méthode est la meilleure : supprimer d'abord le cache ou mettre à jour la base de données d'abord, pensant que les deux eux ont des problèmes. Nous comparerons plus en détail ces deux méthodes plus tard, mais nous discutons ici d'abord de la manière de résoudre les problèmes qui surviennent dans les scénarios ci-dessus ? 🎜🎜En fait, quelle que soit la méthode que nous utilisons ci-dessus pour synchroniser le cache et la base de données, lorsque la deuxième étape échoue, il est recommandé d'utiliser un mécanisme de nouvelle tentative, qui a été dessiné dans les deux images au-dessus de . 🎜quand il n'y a pas d'échec
pour comparer : 🎜🎜 Comme indiqué ci-dessus, le cache est d'abord supprimé, puis la base de données est mis à jour. Il n'y a pas de Problèmes possibles en cas de panne : 🎜<ul>
<li>Le thread A a supprimé le cache avec succès ; </li>
<li>Le thread B n'a pas réussi à lire le cache ; </li>
<li>Le thread B a réussi à lire la base de données et a récupéré les anciennes données ; </li>
<li>Le thread B a réussi à mettre à jour les anciennes données dans le cache ; will Les nouvelles données sont mises à jour avec succès dans la base de données. </li>
<li>On peut voir que les deux étapes du processus A ont réussi, mais en raison de la concurrence, le processus B a accédé au cache entre les deux étapes. </ul>Le résultat final est que les anciennes données sont stockées dans le cache et les nouvelles données sont stockées dans la base de données, et les deux données sont incohérentes. <p><strong></strong></p>
<hr>
<hr>
<p> Comme le montre l'image ci-dessus, la base de données est d'abord mise à jour, puis le cache est supprimé. Problèmes possibles dans <img src="https://img.php.cn/upload/article/000/000/067/e73f1a06231a665bb67debaa27b6baf0-3.png" alt="Comment assurer la cohérence entre le cache Redis et la base de données"> : <br><code>没有出现失败时
Le thread A a mis à jour la base de données avec succès ; . Mais le thread B lit les anciennes données pendant ce processus. Il peut y avoir d'autres threads comme le thread B qui lisent les anciennes données dans le cache entre ces deux étapes, mais comme la vitesse d'exécution de ces deux étapes sera plus rapide, l'impact n'est donc pas important. grand. Après ces deux étapes, lorsque d’autres processus liront les données mises en cache, des problèmes similaires à ceux du processus B ne se produiront plus. Conclusion finale :
Après comparaison, vous constaterez que mettre à jour d'abord la base de données puis supprimer le cache est une solution avec moins d'impact. Si la deuxième étape échoue, un mécanisme de nouvelle tentative peut être utilisé pour résoudre le problème.
4. Double suppression retardée
si le cache est d'abord supprimé puis la base de données est mise à jour, cela peut entraîner une incohérence des données même s'il n'y a pas d'échec. Si dans des applications réelles, nous devons choisir cette méthode en raison de certaines considérations, existe-t-il un moyen de résoudre ce problème ? La réponse est oui, c'est-à-dire adopter la stratégie de double suppression retardée. L'idée de base de double suppression retardée est la suivante :
supprimer le cachepublic void write(String key, Object data) { Redis.delKey(key); db.updateData(data); Thread.sleep(1000); Redis.delKey(key); }
4.1 Que faire si l'architecture sépare la lecture et l'écriture ? Si la base de données adopte une architecture de séparation lecture-écriture, alors de nouveaux problèmes surgiront, comme indiqué ci-dessous :
A ce moment, deux requêtes sont arrivées, la requête A (opération de mise à jour) et la requête B (opération de requête)
Demander à A d'effectuer une opération de mise à jour et de supprimer Redis ;
Si la suppression échoue toujours, vous pouvez augmenter le nombre de tentatives, mais ce nombre doit être limité. Lorsqu'il dépasse un certain nombre, des mesures telles que le signalement des erreurs, l'enregistrement des journaux et l'envoi de rappels par e-mail doivent être prises. 5. Utilisez la file d'attente des messages pour compenser la suppression
Mettez d'abord à jour la base de données, puis supprimez le cacheLa solution pour le moment est d'utiliser la file d'attente des messages pour compenser la suppression. Le langage de logique métier spécifique est décrit comme suit :
Apprentissage recommandé :
Tutoriel 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!