Javaのキャッシュ・アーキテクチャ列車--Redis浸透/故障/アバランチ

キャッシュの浸透

高い同時実行の下では、クエリの値が存在しない場合、キャッシュは多数の要求で、その結果、ヒットしなかったが、データベースに直接落ちます。
たとえば、次のコード:
キャッシュなしの最初のクエリキャッシュ、クエリーデータベース、およびキャッシュに。

		String categoryVOSStr=redisOperator.get("subCat:"+rootCatId);
        if (StringUtils.isBlank(categoryVOSStr)){
            categoryVOS=categoryService.getSubCatList(rootCatId);
            if (categoryVOS!=null&&categoryVOS.size()!=0)
                redisOperator.set("subCat:"+rootCatId,JsonUtils.objectToJson(categoryVOS));
        }

rootCatIdは現在のデータベースにクエリを使用している場合は、例えばrootCatIdは再び1、その後、次のクエリであり、それらはキャッシュへのキー見つける:SUBCAT:1つのキャッシュを。

しかしrootCatIdは、クエリは、このような不正ユーザの攻撃として、データベースに存在しない場合は、要求の多数の要求が999、999及びIdは、キャッシュが生成されていない現時点では、データベースをrootCatId、多数の要求は直接デシベルを打ちます得られたダウンタイムは、従って、システム全体に影響を与えます。この現象は、キャッシュの浸透と呼ばれています。

キャッシュの浸透が比較的容易に解決することであり、以下のように、最も簡単な方法は:
空のデータはまた、空の文字列、空のオブジェクト、空の配列またはリストとして、キャッシュされています。(有効期限は、NULLデータに設定してもよいです。)

		String categoryVOSStr=redisOperator.get("subCat:"+rootCatId);
        if (StringUtils.isBlank(categoryVOSStr)){
            categoryVOS=categoryService.getSubCatList(rootCatId);
            redisOperator.set("subCat:"+rootCatId,JsonUtils.objectToJson(categoryVOS));
        }

キャッシュの内訳

高い同時実行では、特定の値を照会するために、今回はちょうどまっすぐデータベースに多数の要求で、その結果、キャッシュ、キャッシュミスが期限切れ。


  1. キャッシュが期限切れになることはありません

最も簡単な方法は、無期限にキャッシュすることであるので、キャッシュの問題時にあまりにも多くのメモリを持つことになり、キャッシュが消去メカニズムをトリガーします。


  1. 制限またはロックします

1つの一般的な方法は、積層キャッシュでIは主ロック制限を分散ない、ウィンドウアルゴリズム、リーキーバケットアルゴリズムとトークンバケットアルゴリズムをスライディング共通のを制限する、または直接キューを使用して、同様にロック、限界であります。
積層キャッシュ:
L1(キャッシュ)とL2(二次キャッシュ)キャッシュの実施形態では、L1キャッシュ無効化短時間、長時間L2キャッシュ無効化を使用して。他の一方でL1データキャッシュから優先アクセス要求、ロックを取得するためにL1キャッシュ・ミスがロックされている場合、1つのスレッドのみ、スレッドは、データベースからデータを読み込み、その後、L1キャッシュとL2キャッシュに更新しますスレッドには、まだL2キャッシュからデータを取得し、返されました。
このように、主にロック機構と連動してキャッシュの同時故障を回避することにより実現しています。より多くのデータがある場合したがって、
唯一のL1キャッシュから、新しい、L1およびL2は、同時にキャッシュになくすことはできません。L2キャッシュが
ダーティデータが存在してもよく、必要であるトラフィックは、このような短絡が矛盾して許容することができますまた、このアプローチは
、追加のキャッシュ空間が浪費さをもたらすことができます。

または破壊の問題を解決することができます提供zookeepミューテックスやRedisのを使用しています。

キャッシュ雪崩

高い同時実行の下では、多数の要求が得られ、同時にキャッシュ無効なキーの多くは、データベース上に落ちます。
雪崩の一般的なキャッシュを使用することができます。

  • キャッシュが期限切れになることはありません
  • 有効期限は、オフセット:ランダムな時間が有効期限を設定するために使用することができます。
  • マルチキャッシュの組み合わせは:必ずしも使用するだけでなく、あなたがそのような他のmemcacheのなどを使用することができ、キャッシュをRedisの。
  • キャッシュがプリロード。

ここで述べた階層化キャッシュキャッシュプリロード:
2回2つのキャッシュはレイヤリング・キャッシュの内側に配置され、expireTimeキャッシュの有効期限、preloadTimeキャッシュ更新時間(時間プリロード)。すべての二次キャッシュがヒット「は以下の非同期スレッドよりはホットデータをキャッシュ、キャッシュを更新するには、事前に開いて、新しい値を入れて、効果的に確保する場合は、キャッシュの有効期限は、より少ないリフレッシュ時間よりもある龍をチェックするために行くですただし、期間。 " ここでは、現在のスレッドの終わりに直接取得するには何のロックが存在しない場合、ライブラリは落ちるすべてのスレッドでキャッシュをフラッシュし、また、事前にキャッシュを更新する必要はないロックされています。

キャッシュは、両方のこの時間を失敗した場合ときキャッシュと同時実行の合計量が非常に大きく、キャッシュ温暖化は新しいオンラインサービスの再起動、または新しいキャッシュ上の、たとえば、非常に長いゆっくりとしたプロセスになります。私たちは、その後、トラフィックの30%、無異常な観察をカットした後、10%カットトラフィックとして始まり、キャッシュはゆっくりとウォームアップするように、流れの途中で異常な観察をカットすることはできません。この時間は全量、その後、トラフィックの60%を切りました。が、この方法はやや面倒ですが、私たちはすぐにそのリスクコントロールという、流れを削減することができます例外が発生しました一回。

公開された385元の記事 ウォンの賞賛326 ビュー160 000 +

おすすめ

転載: blog.csdn.net/No_Game_No_Life_/article/details/104308881