ホームページ  >  記事  >  データベース  >  Redis に基づくデータのキャッシュに関する一般的な問題を解決する方法

Redis に基づくデータのキャッシュに関する一般的な問題を解決する方法

王林
王林転載
2023-05-29 15:07:20861ブラウズ

1. キャッシュの侵入

1.1 問題の説明

キャッシュの侵入は、クライアント/ブラウザ側に存在しないキーを要求することです。このキーは Redis に存在しません。データベース内のデータ ソース。このキーのリクエストをキャッシュから取得できないたびに、データ ソースがリクエストされます。

存在しないユーザー ID を使用してユーザー情報にアクセスすると、その情報は Redis にもデータベースにもありません。複数のリクエストによりデータ ソースが過負荷になる可能性があります。

Redis に基づくデータのキャッシュに関する一般的な問題を解決する方法

# #1.2 解決策

キャッシュ内に存在してはならず、クエリできないデータです。キャッシュはミスがあると受動的に書き込まれるため、キャッシュは存在しません。フォールト トレランスを考慮すると、キャッシュに存在するデータは存在しません。 redis でキャッシュすると、存在しないデータが要求されるたびにデータベースが要求されるため、キャッシュの意味が失われます。

(1) クエリによって返されたデータが空の場合 (データが存在するかどうかに関係なく)、空の結果 (null) をキャッシュし、空の結果の有効期限を次のように設定します。非常に短く、最長で 5 分以内

(2) アクセシブル リスト (ホワイトリスト) を設定します。ビットマップ タイプを使用してアクセシブル リストを定義します。リスト ID はビットマップのオフセットとして使用されます。各アクセスとビットマップ内の ID を比較し、アクセス ID がビットマップにない場合は、インターセプトしてアクセスを禁止します。

(3) ブルームフィルターを利用する

(4) リアルタイムデータ監視を実施し、Redisのヒット率が急激に低下した場合にアクセスオブジェクトとアクセスデータを確認し、設定を行うブラックリスト。

2. キャッシュの内訳

2.1 問題の説明

ユーザーが既存のキーのデータをリクエストすると、redis 内のキーのデータが古くなります。の同時リクエストでキャッシュの有効期限が切れていることが判明すると、データ ソースはデータのロードを要求され、redis にキャッシュされます。このとき、多数の同時リクエストによりデータベース サービスが圧倒される可能性があります。

2.2 解決策

特定のキーのデータが大量に要求される場合、このキーはホット データであるため、「故障」問題を回避するために考慮する必要があります。

(1) 事前に設定された人気のあるデータ: redis のアクセスがピークになる前に、事前にいくつかの人気のあるデータを redis に保存し、これらの人気のあるデータキーの期間を長くします

(2) リアルタイム調整 : どのデータが人気があるかをオンサイトで監視し、キーの有効期限の長さをリアルタイムに調整します

(3) ロックの使用:

  • はキャッシュの有効期限が切れたときです (データベースをすぐにロードするのではなく、取り出した値が空であると判断されます。

  • まず、成功した操作の戻り値を持つキャッシュ ツールのいくつかの操作 (Redis の SETNX など) を使用して、ミューテックス キーを設定します。

  • いつ操作が正常に返された場合は、load db 操作を再度実行し、キャッシュを復元し、最後にミューテックス キーを削除します。

  • 操作が失敗を返した場合は、スレッドのロードがあることが証明されます。 db を実行すると、現在のスレッドはしばらくスリープ状態になります。get Cache メソッド全体を再試行する時間です。

Redis に基づくデータのキャッシュに関する一般的な問題を解決する方法

3. キャッシュ雪崩

3.1 問題の説明

対応するデータは存在しますが、キー データが存在しません。期限切れ (Redis キャッシュの有効期限が切れ、このキーは自動的に削除されます)。この時点では、多数の同時リクエストが異なるキーにアクセスします。つまり、多数の異なるキーが同時にアクセスされます。キーが有効期限に達し、データベースが要求される 大量の同時リクエスト データベース サーバーに負荷がかかる この状況をキャッシュ雪崩と呼びます キャッシュの故障との違いは、前者がキーであることです。

Redis に基づくデータのキャッシュに関する一般的な問題を解決する方法

3.2 解決策

キャッシュに障害が発生した場合の雪崩現象は、基盤となるシステムに重大な影響を与えます。

(1) マルチレベル キャッシュ アーキテクチャの構築:

  • nginx キャッシュ redis キャッシュ 他のキャッシュ (ehcache など)

(2) ロックまたはキューを使用する:

  • #ロックまたはキューを使用して、大量のロックが発生しないようにします。データベースに同時にアクセスするスレッド 障害が発生した場合に、基盤となるストレージ システムに大量の同時リクエストが発生するのを避けるために、読み取りと書き込みが継続的に実行されます。同時実行性が高い状況には適用されません。

(3) キャッシュを更新するために有効期限フラグを設定します。

  • かどうかを記録します。キャッシュされたデータの有効期限が切れた場合 (事前量を設定)、有効期限が切れると、別のスレッドへの通知がトリガーされ、実際のキーのキャッシュがバックグラウンドで更新されます。

(4) キャッシュの有効期限を分散します:

  • たとえば、元の有効期限に基づいて次のようにすることができます。ランダムな 1 ~ 5 分などのランダムな値を追加すると、各キャッシュの有効期限の繰り返し率が減少し、集合的な障害イベントが発生しにくくなります。

以上がRedis に基づくデータのキャッシュに関する一般的な問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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