四月份的時候、有位朋友去美团面试,他说被 Redis と MySQL 双写一致性はどのように保たれますか? この道の問題は、双書场の環境下でデータベースが保存されている場合、一致性はどのように保たれますか?
# 一貫性とは、データが一貫した状態を保つことであり、分散システムでは、複数のポイントのデータの値が一致していると理解できます。
キャッシュによりパフォーマンスが向上し、データベースの負荷が軽減されますが、キャッシュを使用するとデータの 不整合の問題が発生する可能性もあります。一般的にキャッシュをどのように使用するのでしょうか?古典的なキャッシュ パターンは 3 つあります。
キャッシュ アサイド パターン、つまり バイパス キャッシュ モードは、キャッシュとデータベース間のデータの不整合の問題を可能な限り解決するために提案されています。
キャッシュアサイド パターンの読み取りリクエスト プロセスは次のとおりです:
キャッシュアサイド パターンの書き込みリクエスト プロセスは次のとおりです:
#更新する場合は、まずデータベースを更新してから、キャッシュを削除してください。 リードスルー/ライトスルー (読み取り/書き込み浸透)
リード/ライトスルーモードでは、サーバーはキャッシュをメインのデータストレージとして使用します。アプリケーションとデータベース キャッシュ間の対話は、抽象キャッシュ層を通じて完了します。 リードスルー
リードスルーの簡単なプロセスは次のとおりです
リードスルーfromキャッシュ データが読み込めない場合は直接返し、読み取れない場合はデータベースからロードしてキャッシュに書き込んでレスポンスを返します。は Cache-Provider の単なる追加レイヤーであり、プロセスは次のとおりです:
リードスルーは実際にはCache-Aside の上にカプセル化の層があり、これによりプログラム コードがより簡潔になり、データ ソースの負荷が軽減されます。
ライトスルー
ライトスルー更新プロセスは次のとおりです。 ライト ビハインド (非同期キャッシュ書き込み)
ライト ビハインド類似点があります キャッシュ プロバイダーは、キャッシュとデータベースの読み取りと書き込みを担当します。それらの間には大きな違いがあります。Read/Write Through はキャッシュとデータを同期的に更新しますが、Write Behind
はキャッシュのみを更新し、 を通じてデータベースを直接更新しません。データベースを更新するバッチ非同期方法。
高い一貫性要件を持つシステムは注意して使用する必要があります。ただし、頻繁に書き込みを行うシナリオには適しており、MySQL の
InnoDB バッファ プール メカニズムはこのモードを使用します。 キャッシュを操作する場合、キャッシュを削除するべきですか、それともキャッシュを更新するべきですか? 一般的なビジネス シナリオでは、
キャッシュ アサイドリクエストを書くときに、なぜ キャッシュを更新せずにキャッシュを削除するのですか?と尋ねる友人もいるかもしれません。 #キャッシュを運用する場合、キャッシュを削除するべきでしょうか、それともキャッシュを更新するべきでしょうか?まず例を見てみましょう:
不整合となり、ダーティなデータが現れます。 。 がキャッシュ を更新する代わりにキャッシュを削除すると、このダーティ データの問題は発生しません。 キャッシュの更新には、キャッシュの削除と比較して 2 つの欠点があります。: キャッシュアサイド キャッシュとデータベースのデータが矛盾しています。キャッシュには古いデータが保存され、データベースには新しいデータが保存されます。したがって、Cache-Aside キャッシュ モードは、キャッシュを最初に操作するのではなく、データベースを最初に操作することを選択します。 戦略を使用するだけでよいと言うかもしれません。遅延二重削除とは何ですか? か キャッシュアサイドは最初にデータベースを操作してからキャッシュを削除します , キャッシュを削除する 2 番目のステップが失敗した場合、削除の失敗によりダーティ データが生成されます~
mysql を例にとると、Alibaba のカナルを使用して binlog ログを収集し、MQ キューに送信し、ACK メカニズムを通じて更新メッセージを確認して処理できます。 、キャッシュを削除し、データ キャッシュの整合性を確保する 推奨学習: "Redis ビデオ チュートリアル スレッド A は最初に書き込み操作を開始し、最初のステップはデータベースを更新することです
このとき、キャッシュにはAさんのデータ(古いデータ)が保存され、データベースにはBさんのデータ(新しいデータ)が保存されており、書き込むキャッシュ値が複雑な計算の後に取得される場合。キャッシュが頻繁に更新されると、パフォーマンスが無駄になります。
二重書き込みの場合、データベースを最初に操作する必要がありますか、それともキャッシュを最初に操作する必要がありますか?
キャッシュ モードでも、まだ質問がある友人がいます。リクエストを書くときに、なぜ
最初にデータベースを操作するのですか?なぜ まずキャッシュ を操作しないのでしょうか? スレッド A が書き込み操作を開始します。最初のステップはキャッシュの削除です。
Jiang Zi には問題があります。La、キャッシュ遅延二重削除
一部の友人は、最初にデータベースを操作する必要はなく、
キャッシュ遅延二重削除
このスリープ時間 = ビジネス ロジック データの読み取りにかかる時間は数百ミリ秒です。読み取りリクエストを確実に終了させるために、書き込みリクエストは、読み取りリクエストによってもたらされる可能性のあるキャッシュされたダーティ データを削除できます。
削除キャッシュの再試行メカニズム
遅延二重削除キャッシュの削除再試行メカニズムを導入できます
データベースを更新するためのリクエストの書き込み
データベースのバイナリログを通じてキー を非同期的に削除することもできます。
以上がRedis と MySQL の間で二重書き込みの一貫性を確保するにはどうすればよいですか? (美団エルミアン)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。