日常のプログラミングでは、一定量の同時実行性または大量のデータを伴う一部のデータベース操作では、フロントエンドにキャッシュ層を追加し、有効期限を設定するのが通常は mongoDB または memcached です。次のように:
同時実行量がそれほど多くない場合、またはデータ操作効率が非常に高い場合、このモードは基本的に問題ありません。
しかし、おそらく、(キャッシュ障害が発生し、同時実行性が高く、データベース操作時間が長い場合) を見たことがあるでしょうか?
1. キャッシュの無効化
2. 最初のプロセスはデータベースに行き、新しいデータを取得します。SQL + プログラムロジックが含まれる場合、5S かかります
3. この 5S の中で、2 番目、3 番目... . N 全員が期限切れのキャッシュを取得したばかりなので、全員がデータベースに接続しました...
4. 結果は明らかです、データベースはテーブルをロックします -> データベースは大量のプロセスを蓄積します -> データベースがハングするまで上!
それでは、この問題をどうやって解決すればいいのでしょうか?実際、最も簡単な解決策は次のとおりです:
ファイル ロックに似たマークを追加して、プログラムが現時点でキャッシュを更新しているかどうかを判断します。
「はい」の場合は、古いキャッシュに直接戻ります (マークが削除されないプログラムエラーによりキャッシュが更新されない問題を回避するために、マークには有効期限が設定されています)
そうでない場合は、設定しますマークを付けてからデータの取得とキャッシュを行い、最後にマークを削除します。
PS. 初めてキャッシュが生成された場合、一部のユーザーはデータを表示できない可能性がありますが、この可能性は非常に小さいため、手動生成などの他の方法で解決できます。
プロセスは次のとおりです:
。