banner
Tenifs

Tenifs

雄关漫道真如铁,而今迈步从头越。
github
follow
zhihu
email

Redis キャッシュの雪崩、キャッシュの撃破、キャッシュの貫通の解決策

キャッシュアバランチ#

キャッシュアバランチ:大量のキャッシュデータが同時に期限切れ(無効)になったり、Redis が故障してダウンした場合、その時に大量のユーザーリクエストがあり、Redis で処理できない場合、これらのリクエストは直接データベースにアクセスすることになり、データベースの負荷が急増し、深刻な場合はデータベースがクラッシュしてダウンし、システム全体が崩壊することになります。

解決策:

  • 大量のデータに同じ期限を設定しないようにし、期限を設定する際にランダムな数値を追加することで、データが同時に期限切れにならないようにします。
  • ミューテックスロック、アクセスするデータが Redis にないことがわかった場合、ミューテックスロックを追加し、同時に 1 つのリクエストだけがキャッシュを構築できるようにします(データベースからデータを読み取り、データを Redis に更新します)。キャッシュの構築が完了したら、ロックを解放します。ミューテックスロックを取得できなかったリクエストは、ロックが解放されるのを待つか、空の値またはデフォルト値を直接返します。ミューテックスロックを実装する際は、タイムアウト時間を設定する必要があります。そうしないと、あるリクエストがロックを取得した後、リクエストが予期しない状況でブロックされ続け、ロックが解放されない場合、他のリクエストはロックを取得できず、システム全体が応答しなくなる現象が発生します。
  • バックグラウンドでキャッシュを更新し、ビジネススレッドがキャッシュの更新を担当しなくなり、キャッシュに有効期限を設定せず、キャッシュを「永久に有効」にし、キャッシュの更新作業をバックグラウンドスレッドに定期的に更新させます。

キャッシュヒット#

キャッシュヒット:キャッシュ内の特定のホットデータが期限切れになった場合、大量のリクエストがこれらのホットデータにアクセスしようとすると、キャッシュから読み取ることができず、直接データベースにアクセスすることになり、高い同時リクエストによってデータベースが崩壊します。

解決策:

  • ミューテックスロック、同時に 1 つのスレッドだけがキャッシュを更新できるようにし、ミューテックスロックを取得できなかったリクエストは、ロックが解放されるのを待つか、空の値またはデフォルト値を直接返します。
  • ホットデータに有効期限を設定せず、バックグラウンドで非同期にキャッシュを更新するか、ホットデータが期限切れになる前に、バックグラウンドスレッドにキャッシュを更新し、再度有効期限を設定するように通知します。

キャッシュ透過#

キャッシュ透過:ユーザーがアクセスするデータがキャッシュにもデータベースにも存在しない場合、リクエストがキャッシュにアクセスする際に無効になり、データベースにアクセスしてもこれらのデータが存在しないことがわかり、キャッシュを構築して後続のリクエストにサービスを提供できなくなります。このようなリクエストが大量にあると、データベースの負荷が急増し、データベースが崩壊します。

解決策:

  • 不正リクエストの判断:リクエストの入口でリクエストパラメータの検証を追加し、パラメータが合理的かつ有効かを確認します。不正なパラメータの場合は、直接エラーを返し、キャッシュやデータベースへのさらなるアクセスを避けます。
  • 空の値またはデフォルト値をキャッシュする、特定のクエリ対象データに対して、キャッシュに空の値またはデフォルト値を設定し、後続のリクエストがキャッシュから空の値またはデフォルト値を直接読み取ってアプリケーションに返し、データベースをさらにクエリしないようにします。
  • ブルームフィルター:ユーザーリクエストが到着したとき、ブルームフィルターを照会してデータが存在するかどうかを迅速に判断し、存在しない場合はデータベースを照会する必要がなくなり、データベースが正常に動作することを保証します。
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。