D'une manière générale, tant que vous utilisez le cache, qu'il s'agisse de Redis ou de Memcache, cela peut impliquer la cohérence du cache de la base de données et des données. Ici, nous prenons Redis comme exemple.
Comment assurer la cohérence entre Redis et la base de données ?
C'est si simple : .
Lors de la lecture, lisez d'abord le cache ; sinon, lisez la base de données, mettez les données dans le cache et renvoyez la réponse. À première vue, le problème de cohérence semble très bien résolu. Mais si vous y réfléchissez bien, vous constaterez qu'il y a toujours un problème : que se passe-t-il si vous mettez d'abord à jour la base de données et ne parvenez pas à supprimer le cache ? Ensuite, il y a de nouvelles données dans la base de données et d'anciennes données dans le cache, et les données sont incohérentes.Plan d'amélioration :
Supprimez d'abord le cache, puis mettez à jour la base de données. Parce que même si la mise à jour de la base de données échoue plus tard et que le cache est vide, il sera à nouveau extrait de la base de données lors de la lecture. Bien qu'il s'agisse de toutes les anciennes données, les données sont cohérentes.
La solution devient donc :
Lors de la mise à jour, supprimez d'abord le cache puis mettez à jour la base de données.
Lors de la lecture, lisez d'abord le cache ; sinon, lisez la base de données, mettez les données dans le cache et renvoyez la réponse.Le problème est-il complètement résolu à ce stade ?
En fait non, dans un scénario à forte concurrence, la situation suivante se produira : les données ont changé, le cache est d'abord supprimé, puis la base de données est modifiée. Avant d'avoir le temps de le modifier, une demande est arrivée, je suis allé lire le cache et j'ai constaté que le cache était vide. Je suis allé lire la base de données, lire les anciennes données avant modification et mettre les anciennes données dans le cache. .
Par la suite, le programme de changement de données a complété la modification de la base de données. Ensuite c'est fini, une incohérence des données se produit à ce moment-là... Solution :Dans ce cas, vous pouvez d'abord modifier l'opération "Modifier la base de données" est placée dans une file d'attente JVM. Après l'arrivée des demandes de lecture ultérieures, l'opération "mise à jour du cache" est également placée dans la même file d'attente JVM. Chaque file d'attente, pour un thread de travail, effectue les opérations associées en séquence selon l'ordre de la file d'attente, afin qu'il puisse être garanti que le "cache de mise à jour" doit être après la modification de la base de données pour garantir la cohérence des données, comme le montre la figure suivante :
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!