Prefacio
Como todos sabemos, Encache es el marco de almacenamiento en caché de código abierto de Java más popular ahora, con configuración simple, estructura clara y funciones potentes. Al anotar @Cachable, puede agregar rápidamente los resultados del método al caché. El caché especificado se puede borrar rápidamente a través de @CacheEvict.
Sin embargo, dado que la anotación @CacheEvict usa el valor clave y no admite la eliminación difusa, encontrará problemas. Cuando uso @Cachable para cooperar con las expresiones de Spring El, agrego múltiples cachés del mismo método, como:
@Getmapping ("/listoftask/{page}/")@cachable (value = "BusinessCache", key = "'Listoftask _'+ #page") Public ResponseMessage <PageTaskvo> getTaskList (@PathVariable ("Page") Página de cadena) {Do algo ...}El código anterior es obtener información de tareas mediante la paginación. Use una expresión EL para obtener la página en el parámetro y use la tecla Cache para agregarla al caché de Ehcache usando @Cachable. En este momento, las claves de los tipos listoftask_1, listoftask_2, listoftask_3 aparecerán en el caché.
Al agregar o eliminar tareas, la lista cambiará. En este momento, debe eliminar todos los cachés relacionados con ListofTask_*. En este momento, no sé cuánto contenido relacionado con ListofTask_* se almacena en caché, por lo que es imposible llamar a @CacheEvict para eliminarlo uno por uno.
Dado que Ehcache no puede soportarlo, solo podemos implementarlo nosotros mismos.
lograr
Teniendo en cuenta el caché agregado mediante el uso de anotaciones, eliminar cachés también utiliza el procesamiento de anotaciones para mantener la consistencia del desarrollo. Las anotaciones también son muy amigables para los desarrolladores. Luego consideramos usar anotaciones personalizadas para difuminar la eliminación de cachés por lotes.
Primero, defina la anotación Cacheremove:
@Target ({java.lang.annotation.elementType.method}) @retención (retenciónPolicy.Runtime) public @Interface Cacheremove {string value (); String [] key ();}Donde, el valor es como ehcache, utilizado para definir el nombre de caché para operar. Una clave es una matriz que almacena expresiones regulares para múltiples claves en caché. El nombramiento de Cacheremove es claro y fácil de entender y no entra en conflicto con la anotación de Ehcache. La definición de la anotación termina aquí. A continuación, debes lidiar con las anotaciones. Debido a que el marco de primavera se usa, es natural que piense en usar AOP para hacer anotaciones.
El propósito de la anotación es la eliminación de caché borrosa por lotes. Se deben considerar los siguientes dos problemas:
La forma en que di y la forma más simple que creo es:
Primero defina el nombre de la clase CachereMoveaspect:
@Aspecto @componentPublic Class CachereMoVeAspect {@PointCut (value = "(ejecución (**.*(..)) && @Annotation (com.example.cacheremove))") private void apoint () {} haz algo ...}Defina una tangente en un área de corte, use la ejecución (**.*(..) && @Annotation (com.example.cacheremove)) para indicar que todas las clases anotadas se ejecutan Cacheremove, y los valores en @Annotation son los nombres completamente calificados de las anotaciones.
Después de definir el punto de incisión, el siguiente resaltado es la implementación específica de la sección. En términos generales, el caché no se eliminará después del método de agregar, eliminar y modificar se ejecuta. Así que use @afterreturning () para implementarlo. Las siguientes cosas deben hacerse en la implementación específica:
La implementación específica es la siguiente:
@AfterReturning (value = "PointCut ()") Private Void Process (unkePoint unePoint) {MethodSignature Signature = (MethodeSignature) unkenPoint.getSignature (); Método método = firma.getMethod (); Cacheremove Cacheremove = Method.getAnnotation (cacheremove.class); if (cacheremove! = null) {string value = cacheremove.value (); String [] keys = cacheremove.key (); // claves regulares que deben eliminarse cachekeys = cacheutils.cachekeys (valor); for (clave de cadena: teclas) {patrón patrón = patrón.compile (clave); for (objeto cachekey: cachekeys) {string cachekeystr = string.valueOf (cachekey); if (patrón.matcher (cachekeystr) .find ()) {cacheutils.remove (valor, cachekeystr); }}}}}}}Lo anterior es la implementación específica de la memoria caché de eliminación de lotes Fuzzy Ehcache. Entre ellos, BusinessCacheutils encapsula la clase de herramienta Ehcache para sí misma. Implementa principalmente funciones normales, como obtener grupos de caché, obtener cachés, eliminar cachés, agregar cachés y ver todos los cachés. El código es el siguiente:
Cacheutils de clase pública {Cachemanager static privado Cachemanager = SpringContexTholder.getBean ("EhcachemanagerFactory"); Objeto estático público get (String Cachename, Key String Key) {elemento de elemento = getCache (Cachename) .get (clave); Elemento de retorno == nulo? nulo: element.getObjectValue (); } public static void put (String Cachename, Key String Key, Object Value) {Element Element = New Element (Key, Value); getCache (Cachename) .put (elemento); } public static void remove (string cachename, clave de cadena) {getCache (Cachename) .remove (clave); } public Static List CacheKeys (String Cachename) {return getCache (Cachename) .getKeys (); } /*** Obtenga un caché, si no se crea nadie. * @param cachename * @return */ private static cache getcache (string cachename) {cache cache = cachemanager.getcache (cachename); if (cache == null) {cachemanager.addcache (cachename); caché = Cachemanager.getCache (Cachename); cache.getCacheConfiguration (). setTernal (true); } return cache; } public static Cachemanager getCachemanager () {return Cachemanager; }}En este punto, se implementa toda la función de eliminación de lotes Fuzzy Ehcache Fuzzy.
Resumir
Todo el proceso tiene una idea simple, y después de usar algún conocimiento de AOP, se completan las funciones requeridas. Sin embargo, la eliminación específica de algunos códigos puede considerarse para la optimización. A través de todos los bucles de caché, se eliminan todos los cachés que deben eliminarse, en lugar de pensar que hay varias teclas como esta, el caché completo se atraviesa varias veces. La implementación específica se deja a los lectores para completar. Espero que te sea útil. También espero que todos apoyen más a Wulin.com.