ホームページ  >  記事  >  データベース  >  mysql と redis の二重書き込みの一貫性を確保する

mysql と redis の二重書き込みの一貫性を確保する

远方*
远方*オリジナル
2022-01-25 10:58:592669ブラウズ

1. シナリオ:

二重書き込みの整合性とは、データベース内のデータを更新するときに、redis 内のデータも同期的に更新する必要があることを意味します。 Redis を使用してデータを読み取るプロセス。ユーザーがデータにアクセスすると、まずデータがキャッシュから読み取られます。キャッシュがヒットした場合は、キャッシュ内のデータが直接ユーザーに返されます。データが存在しない場合は、キャッシュ内のデータがユーザーに返されます。キャッシュの場合、最初にデータベースがクエリされ、クエリされたデータがキャッシュに保存されてからユーザーに返されます。

mysql と redis の二重書き込みの一貫性を確保する

2. 二重書き込みの一貫性を確保するための戦略

1. 最初にキャッシュを更新し、次にデータベースを更新します

2. 更新最初にデータベースを更新し、次にキャッシュを更新します

3. 最初にキャッシュを削除し、次にデータベースを更新します

4. 最初にデータベースを更新し、次にキャッシュを削除します

3. 4 つの戦略の長所と短所

1. 最初にキャッシュを更新し、次にデータベースを更新します

# 問題は明白です。キャッシュは正常に更新されたが、データベースの更新が失敗すると、キャッシュ内のダーティ データが発生します。

2. 最初にデータベースを更新し、次にキャッシュを更新します

同時実行性が高い場合は、次のようになります。状況が存在する可能性があります。スレッド A がデータベースを更新します。ネットワークまたはその他の理由により、スレッド A にキャッシュを更新する時間がなかった場合、プロセス B がデータベースを更新し、キャッシュを更新します。その後、プロセス A が更新されます。これにより、トランザクション損失の状況のように、スレッド B がキャッシュへの更新を失うことになります

3. まずキャッシュを削除してから、データベースを更新します

# # この戦略では戦略 2 のキャッシュ損失を回避できた可能性がありますが、同時実行性が高い状況では不整合も発生します。たとえば、スレッド A が書き込み操作を実行するとき、最初にキャッシュを削除してから、新しいデータベースとの通信の準備をします。このとき、スレッド B はキャッシュにヒットせずに書き込み操作を実行し、データベースにクエリを実行します。このとき、古い値が読み取られ、クエリされた古い値がキャッシュに保存されます。その後、スレッド A は、データベースの更新が完了した後、キャッシュを遅延して削除することは、遅延二重削除とも呼ばれます。ここでの遅延時間は、ビジネスの読み取り操作の時間より大きくなければなりません。

4. まずデータベースを更新してからキャッシュを削除します

同時実行性がどれほど高くても、スレッド A がデータを読み取るときなど、不整合が発生します。キャッシュへの書き込みの準備中に、スレッド B がデータベースを更新し、その後キャッシュの削除操作を実行しました。このとき、スレッド A は古い値をキャッシュに書き込みましたが、これが起こる可能性は比較的低いですが、書き込みが行われているため、動作時間は読み取り動作の時間よりも長くなります。解決策: 二重削除の遅延。二重削除の遅延は依然として問題です。キャッシュの削除に失敗した場合はどうすればよいですか? もちろん、もう一度削除して、ループで削除を続けます。削除が失敗した後は、削除するキーをキューに入れ、削除が成功するまで繰り返し削除を試行できます。

以上がmysql と redis の二重書き込みの一貫性を確保するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。