cache Redis et les problèmes de cohérence des bases de données à double écriture

Tout d' abord, le cache en raison de ses caractéristiques de haute concurrence et de haute performance, a été largement utilisé dans le projet. En termes de cache de lecture, nous doutons rien, sont conformes à l'organigramme à côté des opérations commerciales.

Mais en termes de mise à jour du cache, à la fin la mise à jour la base de données, il met à jour le cache ou supprimer le cache. Ou est de supprimer le cache, puis mettre à jour la base de données, en fait, nous restons très controversé. Il n'y a pas un blog de complet, ces différents types parse de programmes. Donc , les blogueurs dans la peur, ils ont bravé le risque d'être pulvérisé, a écrit cet article.

article Structure

Cet article se compose de trois parties
1, pour expliquer la politique de mise à jour du cache
2, pour chaque stratégie d'analyse désavantage
3, sont donnés pour les défauts de raffinement

texte

Faites une description, en théorie, pour régler l'heure d'expiration du cache, il est d'assurer la cohérence de la solution finale. Dans ce programme, nous pouvons régler l'heure d'expiration pour les données mises en cache, toutes les écritures à la base de données l' emportent, le fonctionnement du cache ne peut faire de notre mieux. Cela signifie que si la base de données mise à jour d' écriture de cache réussie a échoué, puis une fois qu'ils atteignent l'heure d'expiration, la demande de lecture ultérieure lira naturellement les nouvelles valeurs de la base de données et puis de remblayer le cache. Par conséquent, la discussion suivante des idées ne dépend pas des paramètres du cache à l'expiration de ce programme.
Nous discutons ici trois stratégie de mise à jour:

  1. Pour mettre à jour la base de données, puis mettre à jour le cache

  2. Supprimez le cache, puis mettre à jour la base de données

  3. Pour mettre à jour la base de données, puis supprimez le cache

Personne ne devrait me demander, pourquoi ne pas mettre à jour le cache d'abord, puis mettre à jour la base de données de cette stratégie.

(1) pour mettre à jour la base de données, puis mettre à jour le cache

Ce programme, ils sont généralement opposés. Pourquoi? Les deux raisons suivantes.
- Causes un (angle de thread-safe)
en demande A et opération de demande de mise à jour B, alors il y aura
(1) Un fil met à jour la base de données
(2) fil B met à jour la base de données
(3) Sujet B met à jour le cache
fils (4) un cache est mis à jour

Une demande de mise à jour du cache qui semblait être les premiers poissons que la demande de B pour mettre à jour le cache, mais parce que les raisons du réseau, B plus tôt qu'un cache est mis à jour. Cela conduit à des données sales, et donc pas pris en compte.
- pour deux raisons (angle de scénario d'affaires)
a les deux points suivants:
(1) Si vous écrivez un scénario de base de données plus, et lire la scène de données est besoins des entreprises relativement petites, en utilisant ce programme conduira à, sont - ils pas lire les données , le cache sera mis à jour fréquemment, les performances des déchets.
(2) Si vous écrivez la valeur de la base de données, pas de cache directement écriture, mais de passer par une série de calculs complexes cache ré-écriture. Ainsi, après chaque écriture à la base de données, les valeurs calculées sont écrites dans le cache à nouveau, sans doute une perte de performance. Il est clair que , supprimez le cache est plus approprié.

La discussion suivante est la plus controversée, d'abord supprimer le cache, puis mettez à jour la base de données. Ou de mettre à jour la base de données, puis supprimez le problème du cache.

(2) pour supprimer le cache, puis mettre à jour la base de données

La raison de ce programme conduira à INCOMPATIBLE Oui. En même temps il y a une demande de mettre à jour l'opération A, les autres demandes de fonctionnement B. Ensuite , il apparaîtra les situations suivantes:
(1) Une demande d'écriture, supprimer le cache
(2) demande à la demande de B a trouvé le cache n'existe pas
demande B (3) pour interroger la base de données pour obtenir l'ancienne valeur
(4) Demande B rédigera la mise en cache ancienne valeur
( 5) une demande d'une nouvelle valeur écrite dans la base de données

La situation ci - dessus entraînera des contradictions. De plus, si le cache ne sert pas à régler l'heure d'expiration de la politique, les données sont toujours sales.
Alors, comment le résoudre? Une temporisation à double stratégie de suppression
code pseudo

publique  vide  écriture ( chaîne  clé, objet de  données) {

        redis.delKey (clé);

        db.updateData (données);

        Thread.sleep (1000);

        redis.delKey (clé);

    }

Traduit en chinois est décrit dans
(1) hors de la première mémoire cache
(2) Base de données d'écriture (ces deux étapes, comme l'original)
(3) Veille de 1 seconde, à nouveau hors de la mémoire cache

deuxième causé par la suppression à nouveau de le faire, peut être mis en cache des données sales dans 1.
Eh bien, celui - ci deuxièmement , comment déterminer le sommeil spécifique combien de temps?
Dans le cas ci - dessus, le lecteur doit évaluer leur propre temps de lire la logique métier de données de leurs propres projets. Ensuite , l' écriture de données à base prend beaucoup de temps de sommeil des données lues sur la logique métier, vous pouvez ajouter quelques centaines de ms. Le but de le faire est de veiller à ce que la fin des requêtes de lecture, les demandes d'écriture peut supprimer des demandes de lecture en cache des données causées par les sales.
Si vous utilisez une architecture de lecture et d' écriture séparée mysql comment faire?
ok, dans ce cas, comme la cause de données incohérentes, ou deux demandes, une demande de mise à jour d' une opération A, l'autre B demande requête opération.
(1) La demande d'écriture, le cache de suppression
(2) de demande de données d'écriture à la base de données,
(3) la requête d'interrogation du tampon B a été trouvé, pas de tampon de valeur
(4) à la requête demande B de la bibliothèque, cette fois, n'a pas synchronisation maître-esclave est terminée, de sorte que l'ancienne valeur de la demande de recherche
(5) pour demander le cache d'écriture de l'ancienne valeur B
(6) à partir de la synchronisation de base de données maître est terminée, la bibliothèque devient une nouvelle valeur

Les circonstances mentionnées ci-dessus, est la raison de données incohérentes. Ou tactiques double retard de suppression. Mais, comme le temps de sommeil modifié dans une synchronisation maître-esclave sur la base du temps de retard, plus quelques centaines de ms.
Avec cette phase synchrone sur la stratégie pour réduire le débit , comment faire?
ok, puis la deuxième suppression comme asynchrone. Vous un fil, asynchrone de suppression. Ainsi, la demande écrite ne dormirait pas après une période de temps, puis revenir. Pour ce faire, pour augmenter le débit.
La seconde suppression En cas d' échec , comment faire?
Ceci est une très bonne question, parce que la deuxième suppression a échoué, une situation se posera. Il y a deux demandes, une demande pour une opération mise à jour A, le fonctionnement des autres demandes B, pour plus de commodité, supposons qu'une seule bibliothèque:
(1) Une demande d'écriture, supprimer le cache
(2) cache découverte requête demande B absente
(3) demande B d'interroger la base de données pour obtenir l'ancienne valeur
(4) demande B rédigera la mise en cache ancienne valeur
(5) une demande d'une nouvelle valeur sera écrite dans la base de données
(6) une demande d'essayer d'écrire à une demande de suppression du cache valeurs B, les résultats échoué.

ok, c'est - à - dire. Si le second cache de suppression échec, les problèmes de cache et la base de données se produisent à nouveau incompatibles.
Comment le résoudre?
Des solutions concrètes, résoudre Regardez le premier blogueur (3) mettre à jour les types de politiques.

(3) pour mettre à jour la base de données, puis supprimez le cache

Tout d'abord, nous allons parler. Les étrangers ont fait une routine de mise à jour du cache, appelé « modèle cache-dehors ». Qui a souligné

  • Échec: Une application pour commencer à prendre cache de données, ne reçoivent pas, récupérer les données de la base de données, après le succès, dans le cache.

  • Hit: l'accès aux applications aux données du cache, prise après le retour.

  • Mise à jour: données dans la base de données mis, après le succès, laissez l'invalidation du cache.

  • De plus, le site de réseautage social Facebook est aussi le papier bien connu « Mise à l'échelle Memcache sur Facebook » proposé, ils sont également utilisés pour mettre à jour la base de données, puis supprimer la stratégie mis en cache.

Ce problème n'existe pas concurrency il?
Il n'est pas. En supposant qu'il y aura deux demandes de faire une demande de requête A, B une demande de faire une opération de mise à jour, il sera généré une situation
(1) échec de tampon seulement
(2) Une demande d'interroger une base de données pour obtenir une valeur ancienne
(3) Demande B la nouvelle valeur écrite dans la base de données
(4) le retrait de la demande de B mises en cache
(5) une demande à l'ancienne valeur du cache d'écriture Trouvées

ok, si cela se produit, vraiment des données sales se produiront.
Cependant, la probabilité que cela se produise et combien do?
Cela se produit il existe une condition congénitale que l' étape opération d'écriture de base de données (3) que dans l' étape (2) pour lire et moins les opérations de base de données prennent beaucoup de temps, possible que l' étape (4) avant l'étape (5). Cependant, nous pensons, la vitesse de lecture beaucoup plus rapide que les opérations d'écriture de base de données (ou bien pourquoi ne lire et la séparation d'écriture, de lecture séparée et écriture est logique parce que l'opération de lecture plus rapide, consomme moins de ressources), et par conséquent l' étape (3) plus courte que l'étape de temps (2), cette situation est difficile à apparaître.
Supposons que quelqu'un a à se chamailler, le trouble obsessionnel-compulsif, doit résoudre comment faire?
Comment résoudre le problème de la concurrence?
Tout d' abord, pour régler le temps de la mémoire tampon est un programme efficace. En second lieu , l'utilisation de la stratégie asynchrone (2) compte tenu du retard dans la politique de suppression de veiller à ce que , après avoir lu la demande est complète, puis supprimez - le.
les incohérences ont causé il y a d'autres raisons?
Oui, cela est la politique de mise à jour du cache (2) et la politique de mise à jour du cache (3) il y a un problème, supprimez le cache échoue si la façon de faire, ce n'est pas le cas , il semble incohérent. Par exemple, une demande d'écriture de données, puis écrites dans la base de données et supprimer le cache échoue, il apparaît sur les incohérences. Ceci est aussi la dernière des questions de politique de mise à jour du cache (2) à gauche.
Comment résoudre?
Fournit un mécanisme de sauvegarde de nouvelle tentative, voici deux options.
Schéma I:
Comme indiqué ci - dessous

schéma ci - dessous,
(1) mettre à jour les données de base de données;
(2) la suppression des problèmes de cache échoué parce que
(3) La clé à supprimer est transmis à la file d' attente de messages
(4) leur propre message de consommation à supprimer est obtenue Key
(5) continuer à relancer l'opération de suppression jusqu'à ce qu'il réussisse

Cependant, cette solution présente l'inconvénient de causer un grand nombre de code de lignes de service. Donc , avec l' option II, dans le second schéma, le programme d'abonnement pour démarrer une base de données d'abonnement binlog, acquérir opération nécessaire. Dans l'application, l'autre d'un programme, l' accès à l' information provenant de ce programme d'abonnement, opération de supprimer le cache.
Schéma Deux:

le flux comme indiqué ci - dessous:
(1) mettre à jour les données de base de données
(2) la base de données de l' information de fonctionnement sera écrit dans le journal qui binlog
programme d'alimentation (3) extraire les données souhaitées et Key
(. 4) d' une autre section du code non service, cette information est obtenue
(5) essaie de fonctionnement cache de suppression, supprimer le défaut trouvé
(6) pour envoyer les informations à une file d' attente de message
(7) des données extraites de la file d' attente de messages en opération de relance.

Remarques: Les procédures ci-dessus ont un middleware existant abonnement binlog appelé le canal, peut être fait pour souscrire la fonction binlog journal dans une base MySQL. Quant à l'oracle, les blogueurs ne savent pas s'il middleware sont ready-made peut être utilisé. En outre, le mécanisme de relance, est l'utilisation de la manière de file d'attente de message de blogueur. Si l'exigence de cohérence est pas très élevé, directement dans le programme à partir d'un autre thread, de temps en temps une nouvelle tentative de rendre ces systèmes flexibles, il peut jouer librement, juste une pensée.

 

 

contrôle de la taille de la mémoire

Le montant total de la sélection de la propriété, une meilleure polyvalence et la facilité d'entretien, tels que la table utilisateur, avec un montant total d'attributs peut,

Mais nous devons considérer le choix des performances du cache et économiser de l'espace bien que nous avons besoin de très bien (mais plus tard changé la structure de la table, l'entretien est faible)

:( cache pénétration directement sur les opérations de couche de stockage, la perte de la signification de la couche tampon)

        Interrogation des données n'existe pas dans une base de données, telles que les informations de produit, ID de requête qui n'existe pas, tous les accès en temps à DB, si quelqu'un dol, probablement causée par une pression excessive directe sur la DB.

solution:

       1. Quand un moment clé de passer par un ensemble de données de requête, si les données correspondantes dans la base de données n'existe pas, nous voyons cette touche correspondant à l'ensemble de la valeur en tant que valeur par défaut, tel que « NULL », et fixer une date d'expiration du cache , cette fois-ci devant un cache miss, tout au long de cette clé pour accéder au cache ont été bloqués. Si cette clé de retour des données correspondant existe dans la base de données, puis un manque de cache, l'accès aux données par cette touche, être en mesure d'obtenir une nouvelle valeur.

       2. La commune est l'utilisation d'un filtre Bloom (avec une petite mémoire peut contenir beaucoup de données), le hachage de toutes les données possibles à un bitmap assez grand, il ne faut pas être présents dans les données bitmap interception hors, évitant ainsi la pression des requêtes sur le système de stockage sous-jacent. (Filtre Bloom: en fait une très longue série de fonction de mappage de vecteur binaire aléatoire et un filtre Bloom peut être utilisé pour récupérer si un élément a l'avantage que dans un ensemble de temps de requête et de l'efficacité de l'espace loin. plus de l'algorithme général, l'inconvénient est une certaine difficulté de taux de reconnaissance d'erreur et à enlever.)

 A propos de filtre Bloom:

 

Cache cache avalanche infirmation :()

      cache d'échec en même temps une grande surface, si les demandes ultérieures tombera sur la base de données, résultant en un temps résister à un grand nombre de demandes de base de données et a rebondi sur.

solution:

     1. La clé dans la invalidation du cache de système uniforme quinconce, afin d'éviter un grand nombre de clé de temps uniforme correspondant à un défaut de cache;

     2. remodelé l'utilisation du cache, quand nous allons interroger la clé de données, la première cache de requêtes, le cache de requête à ce moment sinon, être distribué par le verrouillage de la serrure, la serrure a rendu le processus de vérification et définissez le cache DB, puis déverrouiller, s'il y a d'autres processus d'attendre un verrou, puis renvoyer les données mises en cache et d'autres encore déverrouiller ou requête DB.

     3. Essayez de garantir une haute disponibilité de l'ensemble Redis du cluster, les temps d'arrêt de la machine trouvée pour compenser le plus tôt possible

     4. ehcache cache local + hystrix limite et déclassement, MySQL éviter out effondrement

Si vous avez effondrés: Vous pouvez également utiliser le mécanisme persistance Redis seront enregistrés dans le cache de récupération de données le plus rapidement possible.

fosse de cache:

Afin de répondre à l'entreprise ainsi que d'un grand nombre de nœuds, mais pas pour améliorer la performance a diminué.

Lorsque le client ajoute un cache, vous pouvez juste mget une fois, mais si plus de trois cache, cette fois-ci vous devez mget trois fois (temps augmente le trafic réseau) pour chacun supplémentaire, les besoins des clients pour faire une nouvelle mGET, de faire pression sur les performances du serveur.

Pendant ce temps, le besoin mget d'attendre le plus lent fonctionnement de la machine est terminée à remplir les opérations mget. Ceci est la conception parallèle, si elle est une conception de série est encore plus lent.

Cela peut se résumer par l'exemple ci-dessus: plus de machines! = Des performances plus élevées

Mais n'est pas rien, généralement lors de l'optimisation IO des méthodes suivantes peuvent être utilisées.

  1. commande optimisée. Tels que les touches lentes sous d'enquête, hgetall bigkey.
  2. Le nombre de fois nous avons besoin de réduire le trafic réseau. L'optimisation de la fréquence d'utilisation dans des applications pratiques les plus, nous essayons de réduire le nombre de communications.
  3. La réduction des coûts d'accès. Client tel que vous utilisez une connexion longue ou un pool de connexion, comme NIO.

résumé

Cet article est en fait l'Internet actuel a la consistance du programme, effectué un résumé. Pour la politique de mise à jour pour supprimer le cache, puis mettre à jour la base de données, ainsi que le schéma proposé maintient une manière de file d'attente de mémoire, les blogueurs regardé, cette réalisation est très complexe, il est nécessaire, il ne faut pas donner dans le texte. Enfin, je l'espère vous gagnez quelque chose

                        <li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#csdnc-thumbsup"></use>
                        </svg><span class="name">点赞</span>
                        <span class="count">1</span>
                        </a></li>
                        <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#icon-csdnc-Collection-G"></use>
                        </svg><span class="name">收藏</span></a></li>
                        <li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#icon-csdnc-fenxiang"></use>
                        </svg>分享</a></li>
                        <!--打赏开始-->
                                                <!--打赏结束-->
                                                <li class="tool-item tool-more">
                            <a>
                            <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
                            </a>
                            <ul class="more-box">
                                <li class="item"><a class="article-report">文章举报</a></li>
                            </ul>
                        </li>
                                            </ul>
                </div>
                            </div>
            <div class="person-messagebox">
                <div class="left-message"><a href="https://blog.csdn.net/qq_16803227">
                    <img src="https://profile.csdnimg.cn/A/D/9/3_qq_16803227" class="avatar_pic" username="qq_16803227">
                                            <img src="https://g.csdnimg.cn/static/user-reg-year/1x/6.png" class="user-years">
                                    </a></div>
                <div class="middle-message">
                                        <div class="title"><span class="tit"><a href="https://blog.csdn.net/qq_16803227" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">君莫笑_0808</a></span>
                                            </div>
                    <div class="text"><span>发布了11 篇原创文章</span> · <span>获赞 6</span> · <span>访问量 2万+</span></div>
                </div>
                                <div class="right-message">
                                            <a href="https://im.csdn.net/im/main.html?userName=qq_16803227" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信
                        </a>
                                                            <a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">关注</a>
                                    </div>
                            </div>
                    </div>
    </article>
    
Publié cinq articles originaux · louanges gagnées 0 · Vues 251

Tout d' abord, le cache en raison de ses caractéristiques de haute concurrence et de haute performance, a été largement utilisé dans le projet. En termes de cache de lecture, nous doutons rien, sont conformes à l'organigramme à côté des opérations commerciales.

Mais en termes de mise à jour du cache, à la fin la mise à jour la base de données, il met à jour le cache ou supprimer le cache. Ou est de supprimer le cache, puis mettre à jour la base de données, en fait, nous restons très controversé. Il n'y a pas un blog de complet, ces différents types parse de programmes. Donc , les blogueurs dans la peur, ils ont bravé le risque d'être pulvérisé, a écrit cet article.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_32822759/article/details/104527169
conseillé
Classement