キャッシュモード
別に1)キャッシュ
更新モード
-
データベースを更新し、キャッシュを更新します。このアプローチの最大の問題は、2個の同時書き込みダーティデータにつながっています。図は、2つの同時更新操作(RedisのとMySQLの例では)以下が、データベースではなく、キャッシュを更新するためにデータベースを更新する、キャッシュを更新するために更新されます。これは、アプリケーションがダーティデータを読んでいる、矛盾しているデータベースとキャッシュのデータになります。
-
キャッシュを削除し、データベースを更新します。2つの同時読み取りおよび書き込み操作はダーティデータを引き起こすので、このロジックは、間違っています。(例RedisのとMySQLで)の下に。更新操作はその後、ちょうど同時読み取りを持って、キャッシュを削除すると仮定した後、データベースから削除キャッシュにヒットし、バックキャッシュを古いデータを更新しなかった、データベースの更新操作を更新するには、この時間が完了しています。この時点で、データベースとキャッシュ内のデータは、アプリケーションで読み取った原稿データ(ダーティデータ)で、矛盾しています。
-
データベースを更新し、キャッシュを削除します。実際には、このような行為はピットとみなすことができない、実際のシステムでもこの方法を使用することをお勧めします。しかし、このアプローチは、理論的にはまだ問題がある可能性がありますされています。図は、(RedisのとMySQLの例では)、何もキャッシュヒットクエリ操作、データベースクエリからの古いデータは存在しない、次の。この時点で、読み取り後にデータベースのデータを更新し、キャッシュ内のデータを削除するには、同時更新、更新操作があります。しかし、バックキャッシュに古いデータの更新を読み出すために、データベースから読み取ります。これは、データベースとキャッシュデータは、矛盾している元のデータ(ダーティデータ)アプリケーション読み出されることになります。
しかし、そのような同時の慎重、非常に低い確率だと思います。この条件は、リードキャッシュキャッシュミスで発生する必要があり、同時書き込みがありますので。これらすべての条件が満たされる確率はないが、実際にはデータベースへの書き込み動作は、読み出し動作よりもはるかに遅いが、また、ロックされ、そしてキャッシュを更新するために、書き込み動作のために遅れて、書き込み動作の前に必要なデータベース操作に読み込ま大規模な。しかし、この極端な状況で生成されたダーティデータの影響を避けるために、我々はまだキャッシュの有効期限を設定する必要があります。
2)リードスルー読み取り
3)ライトスルーライトスルー
4)ライトビハインドのキャッシング