概要
毎日の開発、システムを構築し、APIを達成するためのフレームワークのさまざまなを使用する必要があります。プログラマとして、フレームワークを使用した以外にも、フレームワークの仕事の原理を理解する必要があります。これは、私たちは問題、および拡張されたカスタムのトラブルシューティングを行うことができます。だから、それをフレームする方法を学びます。私たちは、通常の文書を読むことによって、ソースコードを表示し、その後すぐに忘れてしまいました。私たちは、習得したことがないことができます。本論文では、例えば春キャッシュ拡張子に基づいて、読み方を効率的にソースを説明します。
SpringCacheはじめに
なぜ二つの理由から、例えば、春のキャッシュを行います。
- 春のフレームワークは、最も人気のあるWeb開発フレームワークである、アイデアを吸収し、コードを読み取るために価値の開発者であります
- キャッシュのエンタープライズ・アプリケーションの開発が不可欠であり、システムの繰り返しで、我々はメモリキャッシュ、分散キャッシュを使用する必要があります。だから、春のキャッシュは接着層として、我々は、基礎となるキャッシュ実装を遮断することができます。
Wordの説明春キャッシュ:コメントとして、使用のAOPは、キャッシュ管理を解放すると思いました。
STEP1ビュードキュメント
まず、公式ドキュメントを見て、春のキャッシュの概要
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-caching.html
重要なポイント
- 2つの抽象インタフェースは
Cache
、CacheManager
特定のインプリメンテーションは、これらの2つの抽象認識に基づいています。
典型的なSPIメカニズム、およびあなたの犬の食べ物を食べます。あなたが外部コールへのインタフェースを提供する必要がある場合は、すべての最初は、それらの内部の実現も抽象的メカニズムの同じセットに基づいている必要があります
キャッシュ抽象化は、実際の店舗を提供し、org.springframework.cache.Cacheとorg.springframework.cache.CacheManagerインタフェースによってマテリアライズド抽象に依存しません。
-
どれもあれば春のキャッシュは、これらのキャッシュの実装を提供し
CacheManage
、またはCacheResolver
意志が指定された順序を達成しないためにあなたは(CachingConfigurerを参照)型のCacheManagerまたはcacheResolverという名前CacheResolverのBeanを定義していない場合は、春ブーツは(指示された順に)次のプロバイダを検出しようとします:
1.Generic
2.JCache(JSR-107)(ehcacheを3、 Hazelcast、Infinispan、その他)
3.EhCache 2.xの
4.Hazelcast
5.Infinispan
6.Couchbase
7.Redis
8.Caffeine
9.Simple
STEP2の実行のデモ
後の春キャッシュの一般的な理解を持って、我々が最初に使用し、デモを実行します。
ユーザーのクエリメソッドを定義します。
@Component パブリック クラスCacheSample { @Cacheable(cacheNames = "ユーザー" ) 公共の地図<ロング、ユーザー>のgetUser(最終コレクション<ロング> ユーザーID){ System.out.printlnは( "キャッシュしません" )。 最終地図<ロング、ユーザー> mapUser = 新しい HashMapの<> (); userIds.forEach(のuserId - > { mapUser.put(userIdを、User.builder()ユーザーIDの(USERID).nameの( "名前" ).build()); }); 返すmapUserを。 }
CacheManagerの設定
@Configuration パブリック クラスCacheConfig { @Primary @Bean(名 = { "のCacheManager" }) 公衆のCacheManager getCache(){ 戻り 新しい ConcurrentMapCacheManagerを( "ユーザ" )。 }
API呼び出し
@RestController @RequestMapping( "/ API /キャッシュ" ) のパブリック クラスCacheController { @Autowired プライベートCacheSample cacheSample。 (@GetMapping "/ユーザ/ V1 / 1" )、 公衆リスト<ユーザ> のgetUser(){ 戻り cacheSample.getUser(は、Arrays.asList(1L、2Lを))。値()ストリーム()。((Collectors.toListを収集)); } }
STEP3のデバッグビューを達成するために
デモ実行後、デバッグ、コードを実装する方法を参照してください。
ソースコードを直接見て関係を呼び出すことはありませんので、それは混乱して見えます。デバッグにより迅速な実現を理解することができます。
私たちは、デバッグロジックは、制御部CacheAspectSupportである主を通じてわかります
最初のキャッシュに基づいてキャッシュされたデータを検索しますキー、言葉がそれに入れていません。
STEP4は、拡張達成します
春のキャッシュを使用する方法を知っている、我々はさらに上を反映する必要があり、それが拡張する方法です。だから、問題が始まります。
たとえば、春のキャッシュがバッチキーキャッシュをサポートしていない、上の例のように、私たちは、キーの代わりにコレクションユーザーIDは、ユーザーIDでキャッシュしたいです。ユーザIDを使用しているので、高いキャッシュヒット率、ストレージの低コスト、キーです。
@Cacheable(cacheNames = "ユーザー" ) パブリックマップ<ロング、ユーザー>のgetUser(最終的なコレクション<ロング>ユーザID){}
だから我々は、Springキャッシュ拡張することを実現しなければなりません。STEP3は、私たちは春のキャッシュの実装の一般的な理解を持っています。したがって、この拡張機能は、コレクションのユーザーID、キャッシュから取得したキャッシュヒットを分割されて達成するために、ヒット、呼び出し方法がありません。
@Aspect @Component パブリック クラスCacheExtenionAspect { @Autowired プライベートCacheExtensionManage cacheExtensionManage; / ** *は、キャッシュヒットのキャッシュから取得された結果を返し、ヒット取得元のメソッドへの呼び出しがない * @param ジョインポイント * @return * / @Aroundは( "@Annotation(org.springframework.cache.annotation.Cacheable)" ) @SuppressWarnings( "未チェック" ) パブリックオブジェクトaroundCache(最終ProceedingJoinPointジョインポイント){ // コレクションは、再構成する必要cacheResult値を変更する 引数を[0] = cacheResult .getMiss()。 試し{ 最終的な地図<オブジェクト、オブジェクト> = notHit CollectionUtils.isEmpty(cacheResult.getMiss())?ナル :(地図 <オブジェクト、オブジェクト> )(Method.invoke(ターゲット、引数)); 最終的な地図<オブジェクト、オブジェクト> =ヒット; cacheResult.getHitを() IF (Objects.isNull(notHit)){ リターンヒット; } // キャッシュ設定 cacheResult.getCache()のputAll(notHit);. hits.putAll(notHit); 戻り安打; } } 次にキャッシュを拡張し、CacheManage 検索キャッシュキャッシュ方法は、新しいCacheResult返し書き換える 国民を 静的オブジェクト参照(最終 CacheExtensionキャッシュ、最終的なオブジェクトキー){ 場合(キーのinstanceofのコレクション){ 最終コレクション<OBJECT> originalKeys = ((コレクション)キー) もし(originalKeys == NULL || originalKeys.isEmpty()){ 戻りCacheResult.builder()キャッシュ(キャッシュ).miss( Collections.emptySet()) .buildを(); } 最終リスト<OBJECT>キー= originalKeys.stream() .filter(オブジェクト::非NULL).collect(Collectors.toList())。 最終的な地図<オブジェクト、オブジェクト> =ヒットcache.getAll(キー); 最終セットの<Object> =ミス新しい新しいHashSetの(キー); miss.removeAll (hits.keySet()); 戻りCacheResult.builder()キャッシュ(キャッシュ).hit(ヒット).miss(ミス).build();. } 戻り NULL ; } キャッシュされた結果をCacheResultが新しいフォーマットで @Builder @Setter @Getter 静的 クラスCacheResult { 最終CacheExtensionキャッシュ; // キャッシュが結果がヒット 最終的に地図<オブジェクト、オブジェクト> HIT; // 呼び出し元のキーを処理する必要が プライベート設定<オブジェクト> ミス。 }
その後のCacheManager、無書き換えを展開し、そのタイプを定義するためにマネージャからのものです
新しいキャッシュを指定するためのCacheManager
@Primary @Bean 公共のCacheManager getExtensionCache(){ 戻り 新しい CacheExtensionManage( "users2を"); }
完全なコード
https://github.com/FS1360472174/javaweb/tree/master/web/src/main/java/com/fs/web/cache
概要
このホワイトペーパーでは、純粋にあなたが良い方法を持っている場合は、共有してください、開始、学習ソースを記述します。