[25] springboot は、キャッシュの侵入を処理するために jedis および redisson Bloom フィルターを統合します

   Springboot の章の全体的なコラム: 


[1] springboot は Swagger を統合します (非常に詳細な

[2] springboot は swagger (カスタム) を統合します (非常に詳細)

[3] springboot 統合トークン (超詳細)

[4] springboot は mybatis-plus を統合します (非常に詳細) (オン)

[5] springboot は mybatis-plus を統合します (非常に詳細) (下記)

[6] springboot はカスタムのグローバル例外処理を統合します

[7] springboot は redis を統合します (非常に詳細)

[8] springbootはAOPを統合してログ操作を実現します(超詳細)

[9] springboot 統合タイミング タスク (超詳細)

[10] springboot は redis を統合してスタートアップ サービスを実現します。つまり、ホットスポット データをグローバルと redis に保存します (超詳細)

[イレブン] スプリングブートはクォーツを統合してタイミングタスクの最適化を実現します(超詳細)

[12] springboot はスレッド プールを統合して高い同時実行性を解決します (非常に詳細で、理解が容易です)

【その13】springbootは非同期呼び出しを統合して戻り値を取得する(超詳細)

[14] springboot は WebService を統合します (超詳細)

[15] springboot は WebService を統合します (パラメーターの受け渡しについて) (超詳細)

[16] springboot は WebSocket を統合します (超詳細)

[Seventeen] springboot が WebSocket を統合してチャット ルームを実現 (超詳細)

[18] springboot はカスタムのグローバル例外処理を実装します

[Nineteen] springboot は ElasticSearch の実戦を統合します (1 万文字)

[Twenty] スプリングブート統合フィルター戦闘

[21] springboot は実戦でのインターセプターを統合し、フィルターを比較します

[22] springboot統合活動7 (1) 実践的なデモンストレーション

【23】springboot統合スプリングビジネスの詳細説明と実戦

[24] springbootはEasyExcelとスレッドプールを使用してExcelデータのマルチスレッドインポートを実現します

[25] springboot は、キャッシュの侵入を処理するために jedis および redisson Bloom フィルターを統合します

[26] springboot はマルチスレッド トランザクション処理を実装します_springboot マルチスレッド トランザクション

[27] springbootはthreadLocal+パラメータパーサーを通じて現在のログイン情報をセッションと同様に保存する機能を実現します 


98dab77ec5c20a2f442e2f45b115d7b7.png

この章では、ブルーム フィルターnull 値の設定という3 つの典型的なキャッシュ問題の 1 つであるキャッシュ ペネトレーションに対する基本的な解決策        を記録する方法を学びます

        このデモを実現するには、jedis と redisson を統合する必要があるため、この記事では主に次の点から開始します。

  • Springboot は Jedis を統合します
  • Springboot は 2 つの方法の Redis (Jedis と Redistemplate) を使用します
  • springboot は Redission Bloom フィルターを統合します
  • springboot でブルーム フィルターを使用する 4 つの方法 (redis、手書き、Redission、Guava で設定)
  • キャッシュの侵入をテストするコードを作成する

QQ 交換グループ ナビゲーション ——> 231378628


目次

1. キャッシュペネトレーションとは何ですか

2. キャッシュペネトレーションを解決する方法

3. SpringBoot で Redis を使用する方法

4 番目に、Springboot がブルーム フィルターを使用する方法

5. springboot は Jedis を統合します

6、SpringBoot は Redisson を統合します

6. デモの準備

7. テスト


1. キャッシュペネトレーションとは何ですか

        まず、この記事の目的は、ブルーム フィルターによるキャッシュ ペネトレーションを解決する方法を学ぶことです。次の図に示すように、キャッシュ ペネトレーションとは何ですか。

99f5389066494258a7f470339466e942.png

        データベースの負荷問題を解決するために、キャッシュが導入され、一部のデータをキャッシュに保存した後、インターフェイスがキャッシュから値を直接フェッチすることで、データベースの負荷が軽減されます。クライアントがアクセスしたデータがキャッシュに存在しない場合、クライアントはデータベースにクエリを実行し、見つかったデータをキャッシュに保存します。キャッシュの破壊は悪意のある攻撃です。データベースに存在しないデータにアクセスし続けるため、結果的にキャッシュに直接アクセスすると、毎回データベースがヒットします。


2. キャッシュペネトレーションを解決する方法

        キャッシュペネトレーションを解決する方法としては、ブルームフィルターとnull値を設定する方法がありますが、この記事では両方の方法を使用します。

1.ブルームフィルター:通常のフィルターインターセプターとして理解でき、addメソッドでフィルターにデータを格納した後、フィルターが提供するcontainsメソッドで特定の値があるかどうかを判断し、戻り値もtrueになります。詳細については、Baidu をご覧ください。特定のエラーが発生します (true を返すと、必ずしも存在しないことを示します。false を返すと、存在するはずがないことを示します) が、キャッシュの侵入を解決する際には、この問題は無視できると思います。存在してはいけません。具体的な使用法では、プロジェクトの開始時にデータベースにクエリを実行し、キャッシュする必要があるすべてのデータをフィルターに保存できます。インターフェイスが呼び出されるたびに、最初にインターフェイスによって判断され、その後ロジックに従います。存在します (キャッシュを確認し、データベースを確認してください)。

5db6bf13bc8c42c3913b2afdad225816.png2. Null値の設定方法:データベースにクエリを実行する際、データが存在しない場合、有効期限の短いキャッシュをredisに設定しておくと、次回キャッシュをクエリするときに値を見つけて、対応する値を直接返すことができます。 null、set 有効期限を短くするのは、後で値が誤って処理されるのを防ぐためです。クエリは常に空であり、キャッシュ リソースを占有する null 値を持つキャッシュが多数存在する可能性があります。

41922f54b11a46f4bbb08c286d7eb2a5.png

 3. 要約すると、このデモのキャッシュ侵入ソリューションは次のとおりです (2 つの方法を組み合わせたもの)。

a18ad18a83e743da97941a45668831f2.png


3. SpringBoot で Redis を使用する方法

        キャッシュの侵入を解決する方法についてはすでに説明しましたが、このセクションでは一般的な springboot で redis を使用する方法を紹介します。非常に単純で、通常は 2 つの方法があり、1 つは RedisTemplate で、もう 1 つは Jedis です。

  • RedisTemplate: RedisTemplate は、SpringDataRedis の JedisApi を高度にカプセル化したものです。
  • Jedis: Jedis は、Java 用 Redis クライアントを操作するために Redis によって公式に推奨されています。

        ネイティブ jedis は redisTemplate よりも効率的です。

        前章では、redis を使用するために redisTemplate を統合しましたので、興味のある方はご覧ください。[7] springboot は redis を統合します (非常に詳細)_

         したがって、このデモの後半では、jedis を使用して redis を操作することになります。

4 番目に、Springboot がブルーム フィルターを使用する方法

Google の Guava        を使用するなど、Springboot で Bloom 有効期限切れを使用する方法も数多くあります

<dependency>
	<groupId>com.google.guava</groupId>
	<artifactId>guava</artifactId>
</dependency>

         または、redis によって提供される redison を使用します。

 <dependency>
     <groupId>org.redisson</groupId>
     <artifactId>redisson</artifactId>
</dependency>

        このデモでは、ブルーム フィルターを使用するために redisson を統合します。

5. springboot は Jedis を統合します

        Jedis を統合する方法は非常に簡単で、次のように依存関係を導入して接続を構成するだけです。 

1. 依存関係を導入する

2964a9a3c68645ca847c45621b8691a3.png

2. 新しい設定ファイルを作成します(とにかく学習です、コード内に設定を書くことも可能です)

05e291d5e9214785aabae3fd27180f28.png

3. Redis 構成ファイルを書き込みます (jedis については、簡素化と一般的な構成情報のために、後でこの構成ファイルに redisson も書きます)。

13489fafee094585bcdcc97480efb758.png

        ResourceBundle と静的ブロックを通じて、構成情報が読み取られ、jedis 接続プールに設定され、接続プールが作成されます。

PS:接続プールを使用せずに直接 Jedis を使用することも可能ですが、その場合、接続が確立されるたびに新しい Jedis オブジェクトが作成されます。データベース接続プールと同様の接続プールを使用することをお勧めします。 。

        次に、Jedis jedis = jedisPool.getResource(); を渡すと、Jedis オブジェクトを取得でき、Jedis が提供する Api メソッドを使用して Redis 操作を実行できます。

6、SpringBoot は Redisson を統合します

        Jedis は上で統合され、Redisson は下で最終的な統合が行われますが、依存関係を導入し、キャッシュに接続し、Redisson を介してブルーム フィルターを作成する必要があります。

1. 依存関係を導入する

c9869241b6bb4cf19331baf77c0be7a0.png

2. redisConfigの変更(上記で作成した設定ファイル、redisson接続の追加、ブルームフィルターの作成)

5909a41830c64cccb402bf8be573bff9.png

PS:記事の冒頭で、ブルーム フィルターにはエラー率があると述べました。そのため、作成時にこのエラー率を制御するパラメーターが存在します。

91bc630d8a83437e845569821c42e858.png

最初のパラメータはサイズを表し、2 番目のパラメータはフォールト トレランス率を表します。詳細については触れませんが、Baidu から学びましょう。 

上記の Bean はシングルトンである必要があり、それ自体で実装するか Spring 管理に引き渡す必要があることを付け加えておきますが、Spring によって作成される Bean はデフォルトでシングルトンです。

6. デモの準備

        この概要では、このデモに必要な最終準備を紹介します. この章の ORM フレームワークは Mybatis-plus を使用しており、[4] springboot 統合 mybatis-plus の具体的な使用法についても触れています (超詳細)

        そのため、マッパーレイヤーなどのコードを作成する必要があります。 

1. データベーステーブルを作成する

CREATE TABLE `product` (
  `pid` int NOT NULL AUTO_INCREMENT,
  `productName` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `price` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT =253 デフォルトの文字セット = utf8mb3 照合 = utf8_bin;

2. 数百のデータをランダムにインポートする

6ca221ae15cc426fab1066ae222d69c8.png

3. エンティティ マッピング クラスを作成する

18868ベッド474d42d59e4a85336ca68f23.png

4. マッパーレイヤーを作成する

e493ae35c17a436dbebc6fc10c9f18d3.png

5. プロジェクト初期化作成時のキャッシュおよびブルームフィルターへの製品情報の格納動作

7c4d5290e5c54e57a81a9d943378a4cb.png

        InitializingBean インターフェースの実装に関しては、前章でも触れていますが、【質問】 springboot プロジェクトでは、database_ を介してインスタンスのポート番号を制限しています 。

6. コントローラーを作成する

6d3dece6305f4d448dcd2a1a4b8d9eff.png

        具体的な処理の流れは上に掲載したフローチャートの処理方法で、最後の部分をテストします。


7. テスト

このデモは swagger を統合しており、そのすべては swagger 呼び出しインターフェイスを通じて直接テストされています。swagger を統合する方法については、 [1] springboot 統合 swagger (超詳細)_        で説明しました。 

1. データベース、キャッシュ、およびブルーム フィルターに存在するデータをテストします。

9745d914e67c4475a5662764d779d3eb.png

2adc6884f24f4c5cb268e135f4e66693.pngブルーム フィルターはバイナリ ベクトルです 

c4db6fdeb3ae4b61adbb03e7f1bf7d0a.png

9f11a4b136724bf4b1bea7a145d57e37.png

1bcbeb91738e4dadad373582e715c612.pngキャッシュが取られていることがわかります。

2. データベース、キャッシュ、またはブルーム フィルターに存在しないデータをテストします。

c4f40b3ac844460b88d021d6069b47e9.png

コンソールは空で、キャッシュとデータベースは消えています。 

3. ブルームフィルターに存在するデータ、データベースに存在しないデータ、およびキャッシュをテストします(元々存在していて削除されたデータをシミュレートします)

シミュレーション操作: サービスの開始後、ID 1 の製品をデータベースとキャッシュから削除します。

580180aefde4468c8f4e2c3d36dd4c18.png

681a08a400f8464a952cd537376003bb.png

キャッシュに移動して null 値を設定します。

a4a6a3ecb02c4614b7733269f3ee935a.png

今回はデータベースがクエリされ、null 値がキャッシュされました。

0acd48134ac04a62876a28c95c1f30d5.png 2 番目のリクエストが行われ、ID 1 の製品をクエリすると、次のようになります。

d6cd3edcffc34518a22e429f62676da7.png

キャッシュにクエリを実行しますが、データベースには再度クエリを実行しません。

この章では他の状況はテストしません。興味のある方はご自身で試してみてください。これまでのところ、NULL 値の設定方法とブルーム フィルター ソリューションの効果をテストしています。

QQ 交換グループ ナビゲーション ——> 231378628

おすすめ

転載: blog.csdn.net/weixin_56995925/article/details/126208394