ホームページ  >  記事  >  データベース  >  Redis キャッシュの侵入を解決する方法

Redis キャッシュの侵入を解決する方法

步履不停
步履不停オリジナル
2019-06-22 17:52:4010498ブラウズ

Redis キャッシュの侵入を解決する方法

キャッシュ テクノロジを使用すると、データベースへの負荷が軽減され、アクセス効率が向上します。現在、エンタープライズプロジェクトではキャッシュがますます注目されています。ただし、キャッシュは単にプロジェクトを無造作に追加することを意味するものではありません。キャッシュをプロジェクトに統合することが最初のステップです。キャッシュによって引き起こされる浸透の問題と、その結果として生じる雪の跳ね返りの問題はすべて、早急に解決する必要がある問題です。この記事では、参考として私が日々のプロジェクトで使用しているソリューションを紹介します。

1. キャッシュペネトレーションの原理

キャッシュの通常の使用法は図に示すとおりです:

Redis キャッシュの侵入を解決する方法

図、キャッシュ使用プロセス:

1. まずキャッシュからデータを取得し、取得できた場合は直接ユーザーにデータを返します。これにより、データベースにアクセスする必要がなくなり、データベースへの負担が軽減されます。

2. キャッシュにデータがない場合は、データベースにアクセスします。

図に示すように、ここにはバグがあります。

Redis キャッシュの侵入を解決する方法

図に示すように、キャッシュはデータベースのファイアウォールのようなものです。これにより、より頻繁にデータが要求されるため、データベースへの負担を軽減するためにキャッシュに保存します。しかし、誰かが悪意を持って攻撃すると、キャッシュに簡単に侵入し、データベースにあらゆる圧力をかけることができます。たとえば、上の図では、キャッシュ内のキーはすべて正の整数ですが、キャッシュにアクセスするキーとして負の数値を使用しています。これにより、キャッシュが侵入され、データベースに直接圧力がかかります。

2. キャッシュ侵入の理由

同時実行性がどれほど大きくても、キャッシュ侵入の問題は必ず発生します。この前提に基づいて、キャッシュ侵入の理由を次のように分析します:

1. 悪意のある攻撃、キーの命名方法を推測し、キャッシュにないキーを使用してアクセスすると推定します。

2. 最初のデータ アクセスでは、キャッシュにデータがまだ存在しない場合、同時シナリオではすべてのリクエストがデータベースにプッシュされます。

3. データベース内のデータも空なので、データベースにアクセスしてもデータは取得できませんので、キャッシュ上には該当するデータが存在しないはずです。これも浸透につながる可能性があります。

3. キャッシュの侵入を解決する

キャッシュの侵入は、図に示すように、侵入の原因を段階的に回避することにあります。 #上に示したように、解決手順は次のとおりです:

Redis キャッシュの侵入を解決する方法

1. Web サーバーの起動時に、同時に頻繁にアクセスされる可能性のあるデータを事前にキャッシュに書き込みます。 -これにより、ステップ 3 での多数のリクエストのキューイングとブロックが回避されます。

  • 2. キーの命名を標準化し、キャッシュ クエリと書き込みエントリを統合します。このようにして、玄関では鍵の特定が検出される。 – このようにして、悪意のあるキーが保存され、傍受されます。

  • 3. 同期二重検出メカニズム. このとき、同期 (Synchronized) メカニズムを使用して、同期コード ブロックの前に、対応するキーがキャッシュに存在するかどうかを確認する必要があります。コード ブロックを同期します。クエリ対象のキーがキャッシュに含まれているかどうかを再度確認します。この「二重検出」の目的は、同時シナリオによって引き起こされる無意味なデータベース アクセスを回避することです (侵入を厳密に回避するためのソリューションでもあります)。

    このステップではキューが発生しますが、最初のステップで述べたように、大量のキューを回避するために、予測可能な多数のリクエストを事前にキャッシュに書き込むことができます。
  • 4. データベースにデータがあるかどうかに関係なく、対応するキーはキャッシュに保存され、値は空になります。 – これは、データベース内にこのデータが存在しないことによる、データベースへの通常のキャッシュ貫通アクセスを回避するためです。

  • 5. 手順 4 で null 値が多すぎると、メモリ不足も発生します。不必要なメモリ消費の原因となります。このように、値が空のキーは定期的にクリーニングする必要があります。メモリが悪意をもって占有されるのを防ぎます。その結果、通常の関数はデータをキャッシュできなくなります。

Redis 関連の技術記事の詳細については、Redis チュートリアル 列をご覧ください。学ぶために !

以上がRedis キャッシュの侵入を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。