ホームページ >データベース >mysql チュートリアル >mysql と redis の二重書き込みの整合性を確保する方法

mysql と redis の二重書き込みの整合性を確保する方法

王林
王林転載
2023-05-28 18:16:231210ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。