序文
誰もが知っているように、Encacheは現在最も人気のあるJavaオープンソースキャッシュフレームワークであり、シンプルな構成、クリア構造、強力な機能を備えています。 @cachableに注釈を付けることにより、メソッド結果をキャッシュにすばやく追加できます。指定されたキャッシュは、@cacheevictを介してすばやくクリアできます。
ただし、@CacheeVict Annotationはキー値を使用しており、ファジー削除をサポートしていないため、問題に遭遇します。 @Cachableを使用してSpring El Expressionsと協力する場合、次のような同じ方法の複数のキャッシュを追加します。
@getMapping( "/listoftask/{page}/")@cachable(value = "businesscache"、key = "'listoffask _'+ #page")public ressonemessage <pagetaskvo> gettasklist(@pathvariable( "page")string page){do home ...}}上記のコードは、ページングによってタスク情報を取得することです。 EL式を使用してパラメーター内のページを取得し、キャッシュキーを使用して @Cachableを使用してEhcacheのキャッシュに追加します。現時点では、listoffask_1のタイプのキー、listoffask_2、listoffask_3がキャッシュに表示されます。
タスクを追加または削除すると、リストが変更されます。この時点で、ListOffask_*に関連するすべてのキャッシュを削除する必要があります。現時点では、ListOffask_*に関連するコンテンツがキャッシュにキャッシュされているかどうかはわかりません。そのため、 @Cacheevictに電話して1つずつ削除することは不可能です。
ehcache自体はそれをサポートできないため、自分で実装することしかできません。
成し遂げる
注釈を使用して追加されたキャッシュを考慮すると、キャッシュを除去すると、発達の一貫性を維持するために注釈処理も使用します。注釈は、開発者にとっても非常に友好的です。次に、カスタムアノテーションを使用して、キャッシュのバッチ除去をぼかすことを検討します。
まず、注釈cacheremoveを定義します。
@target({java.lang.annotation.elementtype.method}) @retention(retentionpolicy.runtime)public @interface cacheremove {string value(); string [] key();}ここで、値はehcacheのようなもので、動作するキャッシュ名を定義するために使用されます。キーは、複数のキャッシュキーの正規表現を保存する配列です。 Cacheremoveの命名は明確で理解しやすく、Ehcache自体の注釈と矛盾しません。注釈の定義はここで終わります。次に、注釈に対処する必要があります。スプリングフレームワークが使用されるため、AOPを使用して注釈を作成することを考えるのは当然です。
注釈の目的は、ぼやけたキャッシュ除去をバッチバッチすることです。次の2つの問題を考慮する必要があります。
私が与えた方法と私が思う最も簡単な方法は:
最初にクラス名を定義しますcacheremoveaspect:
@aspey @componentPublic class cacheremoveaspect {@pointcut(value = "(execution(**。*(..))&& @annotation(com.example.cacheremove))")private void pointcut(){} {}}}}スライス領域の接線を定義し、実行(**
切開点が定義された後、次のハイライトはセクションの特定の実装です。一般的に、追加、削除、変更の方法が実行された後、キャッシュは削除されません。したがって、@afterturning()を使用して実装してください。次のことは、特定の実装で行う必要があります。
特定の実装は次のとおりです。
@afterturning(value = "pointcut()")private void process(joinpoint joinpoint){methodignature signature =(methodingignature)joinpoint.getSignature();メソッドメソッド= signature.getMethod(); cacheremove cacheremove = method.getannotation(cacheremove.class); if(cacheremove!= null){string value = cacheremove.value(); string [] keys = cacheremove.key(); //削除する必要がある通常のキーリストcachekeys = cacheutils.cachekeys(value); for(string key:keys){pattern pattern = pattern.compile(key); for(object cachekey:cachekeys){string cachekeystr = string.valueof(cachekey); if(pattern.matcher(cachekeystr).find()){cacheutils.remove(value、cachekeystr); }}}}}}}上記は、ehcacheファジーバッチ除去キャッシュの特定の実装です。その中で、BusinessCacheutilsは、それ自体のehcacheツールクラスをカプセル化します。主に、キャッシュプールの取得、キャッシュの取得、キャッシュの除去、キャッシュの追加、すべてのキャッシュの表示など、通常の機能を実装します。コードは次のとおりです。
Public Class Cacheutils {private static cachemanager cachemanager = springcontextholder.getbean( "ehcachemanagerfactory"); public staticオブジェクトget(string cachename、string key){element element = getcache(cachename).get(key); return element == null? null:element.getObjectValue(); } public static void put(string cachename、string key、object value){element element = new Element(key、value); getCache(cachename).put(element); } public static void remove(string cachename、string key){getcache(cachename).remove(key); } public static List Cachekeys(String Cachename){return getCache(cachename).getKeys(); } /***作成されていない場合は、キャッシュを取得します。 * @param cachename * @return */ private static cache getCache(String cachename){cache cache = cachemanager.getCache(cachename); if(cache == null){cachemanager.addcache(cachename); cache = cachemanager.getcache(cachename); cache.getCacheConFiguration()。seteternal(true); }キャッシュを返します。 } public static cachemanager getCacheManager(){return cachemanager; }}この時点で、Ehcacheファジーバッチ除去機能全体が実装されています。
要約します
プロセス全体には簡単なアイデアがあり、AOPの知識を使用した後、必要な関数が完了します。ただし、一部のコードの特定の削除は、最適化のために考慮することができます。すべてのキャッシュループを介して、削除する必要があるすべてのキャッシュは、このようないくつかのキーがあると考えるのではなく、完全なキャッシュが数回通過します。特定の実装は、読者に完了するために任されています。それがあなたに役立つことを願っています。また、誰もがwulin.comをもっとサポートすることを願っています。