En avril, un ami s'est rendu à Meituan pour une interview. Il a dit qu'on lui avait demandé comment assurer la cohérence de la double écriture entre Redis et MySQL ? Cette question demande en fait comment assurer la cohérence du cache et de la base de données dans un scénario de double écriture ? Cet article discutera avec vous de la manière de répondre à cette question.
La cohérence est la cohérence des données Dans un système distribué, elle peut être comprise comme la cohérence des données dans plusieurs. nœuds Les valeurs sont cohérentes.
la mise en cache peut améliorer les performances et soulager la pression sur la base de données, mais l'utilisation du cache peut également entraîner une incohérence des données. Comment utilisons-nous généralement le cache ? Il existe trois modèles de mise en cache classiques :
Modèle de cache-aside, c'est-à-dire Mode de contournement du cache, son Il est proposé de résoudre autant que possible le problème d'incohérence des données entre le cache et la base de données.
Modèle en cache-asideLe processus de demande de lecture est le suivant :
Modèle de cache-asideLe processus de demande d'écriture est le suivant :
Lors de la mise à jour,mettez d'abord à jour la base de données, puis supprimez le cache.
Read-Through/Write-Through (pénétration lecture-écriture)Read/Write Through mode, le serveur utilise le cache comme stockage de données principal. L'interaction entre l'application et le cache de la base de données s'effectue via la couche de cache abstraite.
Read-ThroughRead-ThroughLe bref processus est le suivant
Cache-Aside ? En fait, Read-Through n'est qu'une couche supplémentaire de Cache-Provider. Le processus est le suivant :
Read-Through n'est en fait qu'une couche d'encapsulation au-dessus deCache-Aside, ce qui rendra le code du programme plus concis tout en réduisant la charge sur la source de données. En mode
Write-ThroughWrite-Through, lorsqu'une demande d'écriture se produit, la couche d'abstraction du cache termine également la mise à jour de la source de données et des données mises en cache. Le processus est le suivant :
Écrire derrière (. écriture de cache asynchrone)Write Behind est similaire à Read-Through/Write-Through, en ce sens que est responsable de la lecture et de l'écriture du cache et de la base de données. Il y a une grande différence entre eux : Cache Provider
Read/Write Through met à jour le cache et les données de manière synchrone, tandis que Write Behind met uniquement à jour le cache, pas directement la base de données, et met à jour la base de données via batch asynchronous.
Les systèmes ayant des exigences de cohérence élevées doivent être utilisés avec prudence. Mais il convient aux scénarios d’écriture fréquents. Le Mécanisme InnoDB Buffer Pool de MySQL utilise ce mode.
Lors de l'utilisation du cache, devez-vous supprimer le cache ou mettre à jour le cache ? Dans les scénarios commerciaux généraux, nous utilisons le modeCache-Aside. Certains amis peuvent demander : Cache-AsideLors de la rédaction d'une demande, pourquoi supprimer le cache au lieu de mettre à jour le cache ?
Lorsque nous exploitons le cache, devons-nous supprimer le cache ou mettre à jour le cache ? Regardons d'abord un exemple :
À ce moment, le cache enregistre les données de A (anciennes données) et la base de données enregistre les données de B (nouvelles données). Les données sont incohérentes et des données sales apparaissent. Si supprimez le cache au lieu de mettre à jour le cache, ce problème de données sales ne se produira pas.
La mise à jour du cache présente deux inconvénients par rapport à la suppression du cache :
En mode cache Cache-Aside
, certains amis se posent encore des questions lors de la rédaction d'une requête, pourquoi Cache-Aside
缓存模式中,有些小伙伴还是有疑问,在写入请求的时候,为什么是先操作数据库呢?为什么不先操作缓存呢?
假设有A、B两个请求,请求A做更新操作,请求B做查询读取操作。
酱紫就有问题啦,缓存和数据库的数据不一致了。缓存保存的是老数据,数据库保存的是新数据。因此,Cache-Aside
exploiter la base de données en premier
Supposons qu'il y ait deux requêtes, A et B, demandant à A d'effectuer l'opération de mise à jour et demandant à B d'effectuer l'opération de requête et de lecture.
Thread A Initiez une opération d'écriture, la première étape est de supprimer le cache
À ce moment, le thread B lance une opération de lecture, le cache manqueIl y a un problème avec Jiang Zi Les données dans le cache et la base de données sont incohérentes. Le cache stocke les anciennes données et la base de données stocke les nouvelles données
. Par conséquent, le mode de mise en cacheCache-Aside
choisit d'exploiter d'abord la base de données au lieu du cache en premier. Certains amis diront peut-être que vous n'avez pas besoin d'exploiter la base de données en premier, utilisez simplement la stratégieDouble suppression retardée du cache
Supprimez d'abord le cache
, puis mettez à jour la base de données Veillez pendant un moment (par exemple 1 seconde) et supprimez à nouveau le cache.
Combien de temps faut-il habituellement pour dormir pendant un certain temps ? Sont-ils tous 1 seconde ?
demande d'écriture pour mettre à jour la base de données
La suppression du cache a échoué pour certaines raisonsCe 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!