Предисловие
Как мы все знаем, Encache - самая популярная структура кэширования с открытым исходным кодом Java, с простой конфигурацией, четкой структурой и мощными функциями. Аннотируя @cachable, вы можете быстро добавить результаты метода в кеш. Указанный кэш можно быстро очистить через @cacheevict.
Однако, поскольку аннотация @cacheevict использует ключевую ценность и не поддерживает нечеткую удаление, вы столкнетесь с проблемами. Когда я использую @Cachable для сотрудничества с Spring EL Expressions, я добавляю несколько кэшей того же метода, например:
@Getmapping ("/listoftsk/{page}/")@cachable (value = "businesscache", key = "'listoftsk _'+ #page") public actionemessage <pagetaskvo> getTaskList (@pathvariable ("page") String Page) {do ...}Приведенный выше код должен получить информацию о задаче с помощью подпечки. Используйте выражение EL, чтобы получить страницу в параметре, и используйте клавишу кэша, чтобы добавить его в кэш eHcache, используя @Cachable. В настоящее время в кэше появятся ключи типа listoftsk_1, listoftsk_2, listoftsk_3.
При добавлении или удалении задач список изменится. В настоящее время вам нужно удалить все кэши, связанные с listoftsk_*. В настоящее время я не знаю, сколько контента связано с Listoftsk_* кэшируется в кэше, поэтому невозможно позвонить @cacheevict, чтобы удалить его один за другим.
Поскольку сам ehcache не может поддержать его, мы можем только реализовать его сами.
выполнить
Учитывая кэш, добавленный с использованием аннотаций, удаление кэша также использует обработку аннотаций для поддержания согласованности разработки. Аннотации также очень дружелюбны для разработчиков. Затем мы рассмотрим использование пользовательских аннотаций для размытия пакетов снятия кэша.
Сначала определите аннотацию CachereMove:
@Target ({java.lang.annotation.elementtype.method}) @harepention (hardententpolicy.runtime) public @Interface cachereMove {String value (); String [] key ();}Где, значение похоже на ehcache, используемый для определения имени кэша для работы. Ключ - это массив, который хранит регулярные выражения для нескольких кэшированных ключей. Наименование CachereMove ясное и легко понять и не конфликтует с аннотацией самого Ehcache. Определение аннотации заканчивается здесь. Далее вам нужно иметь дело с аннотациями. Поскольку используется пружинная структура, естественно, что вы будете думать об использовании AOP для аннотаций.
Целью аннотации является пакетное удаление кеша. Необходимо рассмотреть следующие два вопроса:
То, как я дал, и самый простой способ, который я думаю:
Сначала определите имя класса CachereMoveaSpect:
@Ampost @ComponentPublic Class CachereMoveaSpect {@pointcut (value = "(выполнение (***.*(..)) && @annotation (com.example.cacheremove))") private void pointcut () {} сделать что -нибудь ...}Определите касательную в зоне нарезки, используйте выполнение (**.*(..) && @annotation (com.example.cacheremove)), чтобы указать, что все аннотированные классы CachereMove выполняются, и значения в @Annotation являются полностью квалифицированными именами аннотаций.
После определения точки разреза следующим образом является конкретная реализация раздела. Вообще говоря, кэш не будет удален после метода добавления, выполнения удаления и модификации. Так что используйте @afterreturning (), чтобы реализовать его. Следующие вещи должны быть сделаны в конкретной реализации:
Конкретная реализация заключается в следующем:
@AfterReturning (value = "pointCut ()") Private void Process (JoinPoint joinPoint) {signature Methodignature = (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.compile (key); for (Object CacheKey: CacheKeys) {String cacheKeyStr = string.valueof (cachekey); if (pattern.matcher (cachekeystr) .find ()) {cacheutils.remove (value, cachekeystr); }}}}}}}Выше приведено специфическая реализация кэша нечеткого партии Ehcache. Среди них BusinessCacheutils инкапсулирует класс инструментов Ehcache для себя. В основном он реализует нормальные функции, такие как получение пулов кэша, получение кэша, удаление кэша, добавление кэши и просмотр всех кешей. Код заключается в следующем:
открытый класс Cacheutils {Private Static Cachemanager Cachemanager = SpringContextholder.getbean ("ehcachemanagerfactory"); Public Static Object get (String Cachename, String Key) {element = getCache (Cachename) .get (key); return Element == NULL? null: element.getObjectValue (); } public static void put (String Cachename, String Key, значение объекта) {element = new Element (ключ, значение); 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 больше.