一般的に、Redis であれ memcache であれ、キャッシュを使用する限り、データベース キャッシュとデータの一貫性が関係する可能性があります。ここでは Redis を例に挙げます。
#Redis とデータベース間の一貫性を確保するにはどうすればよいでしょうか?
# とても簡単: (推奨学習: Redis ビデオ チュートリアル ) ## 更新したら、最初にデータベースを更新してからキャッシュを削除します。
読み取りの場合は、最初にキャッシュを読み取ります。そうでない場合は、データベースを読み取り、データをキャッシュに入れて、応答を返します。
一見すると、一貫性の問題は非常にうまく解決されているように見えます。しかし、よく考えてみると、まだ問題があることがわかります。最初にデータベースを更新し、キャッシュの削除に失敗したらどうなるでしょうか。この場合、データベースには新しいデータがあり、キャッシュには古いデータが存在し、データは不整合になります。
改善計画:まずキャッシュを削除してからデータベースを更新します。後からデータベースの更新に失敗してキャッシュが空になったとしても、読み込み時に再度データベースから引っ張ってくるため、古いデータばかりではありますが、データの整合性は保たれています。
したがって、計画は次のようになります:更新するときは、最初にキャッシュを削除してからデータベースを更新します。
読み取りの場合は、最初にキャッシュを読み取ります。そうでない場合は、データベースを読み取り、データをキャッシュに入れて、応答を返します。
この時点で問題は完全に解決されましたか?実際には、そうではありません。同時実行性の高いシナリオでは、データが変更され、最初にキャッシュが削除され、次にデータベースが変更されるという状況が発生する可能性があります。変更する前にリクエストが来て、キャッシュを読みに行ったところ、キャッシュが空であることがわかりました。データベースを読みに行き、変更前の古いデータを読み取って、古いデータをキャッシュに入れました。 。
その後、データ変更プログラムによるデータベースの変更が完了しました。この時点でデータの不整合が発生しました...
解決策: この場合、最初に「DB の変更」を変更できます。操作は JVM キューに入れられます。後続の読み取りリクエストが到着すると、「更新キャッシュ」操作も同じ JVM キューに入れられます。ジョブ スレッドの各キューは、キューの順序に従って関連する操作を順番に実行します。したがって、次の図に示すように、データの一貫性を確保するために DB が変更された後に「更新キャッシュ」が存在する必要があることが保証されます。
以上がRedis はデータの一貫性をどのように確保しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。