머리말
우리 모두가 알고 있듯이 Enbache는 간단한 구성, 명확한 구조 및 강력한 기능을 통해 가장 인기있는 Java 오픈 소스 캐싱 프레임 워크입니다. @Cachable에 주석을 달면 캐시에 메소드 결과를 빠르게 추가 할 수 있습니다. 지정된 캐시는 @cacheevict를 통해 빠르게 지울 수 있습니다.
그러나 @CacheEvict 주석은 키 값을 사용하고 퍼지 삭제를 지원하지 않기 때문에 문제가 발생합니다. @Cachable을 사용하여 Spring El 표현과 협력 할 때 다음과 같은 동일한 방법의 여러 캐시를 추가합니다.
@getMapping ( "/listoftask/{page}/")@cachable (value = "businesscache", key = " 'listOftAsk _'+ #Page") public responseMessage <PagetAskVo> getTaskList ( "page") 문자열 페이지)위의 코드는 페이징으로 작업 정보를 얻는 것입니다. EL 표현식을 사용하여 매개 변수에서 페이지를 가져 와서 캐시 키를 사용하여 @Cachable을 사용하여 Ehcache 캐시에 추가하십시오. 현재 ListOftask_1, ListOftask_2, ListOftask_3 유형의 키가 캐시에 나타납니다.
작업을 추가하거나 삭제할 때 목록이 변경됩니다. 현재 ListOftask_*와 관련된 모든 캐시를 제거해야합니다. 현재 ListOftask_*와 관련된 콘텐츠가 캐시에 캐시되는지는 모르겠으므로 @CacheEvict에 전화하여 하나씩 삭제하는 것은 불가능합니다.
Ehcache 자체는 그것을 지원할 수 없기 때문에 우리는 직접 구현할 수 있습니다.
성취하다
주석을 사용하여 추가 된 캐시를 고려하여 캐시를 제거하면 주석 처리를 사용하여 개발 일관성을 유지합니다. 주석은 또한 개발자에게 매우 친숙합니다. 그런 다음 캐시의 배치 제거를 흐리기 위해 사용자 정의 주석을 사용하는 것을 고려합니다.
먼저, 주석 캐시 레 미지를 정의하십시오.
@TARGET ({java.lang.annotation.elementtype.method}) @retention (retentionpolicy.runtime) public @interface cacheremove {String value (); 문자열 [] key ();}여기서 값은 Ehcache와 같으며 작동 할 캐시 이름을 정의하는 데 사용됩니다. 키는 여러 캐시 키드 키에 대한 정규 표현식을 저장하는 배열입니다. Cacheremove의 이름 지정은 명확하고 이해하기 쉽고 Ehcache 자체의 주석과 충돌하지 않습니다. 주석의 정의는 여기서 끝납니다. 다음으로 주석을 다루어야합니다. 스프링 프레임 워크가 사용되기 때문에 AOP를 사용하여 주석을달라고 생각하는 것은 당연합니다.
주석의 목적은 흐릿한 캐시 제거를 일괄하는 것입니다. 다음 두 가지 문제를 고려해야합니다.
내가 준 방식과 가장 간단한 방법은 다음과 같습니다.
먼저 클래스 이름 CacherEmoveAcepect를 정의하십시오.
@agage @componentpublic class cacheremoveAspect {@pointcut (value = "(execution (**.*(..)) && @annotation (com.example.cacheremove)")) private void pointcut () {} do do do}슬라이싱 영역에서 탄젠트를 정의하고, 실행 (**.*(..) && @annotation (com.example.cacheremove)을 사용하여 모든 주석이 붙은 클래스 캐시 레지브가 실행되고 @annotation의 값이 주석의 완전한 자격을 갖춘 이름임을 나타냅니다.
절개 지점이 정의 된 후 다음 하이라이트는 섹션의 특정 구현입니다. 일반적으로, 추가, 삭제 및 수정 방법이 실행 된 후에 캐시는 제거되지 않습니다. 따라서 @AfterReturning ()을 사용하여 구현하십시오. 특정 구현에서 다음과 같은 사항을 수행해야합니다.
특정 구현은 다음과 같습니다.
@AfTerReTurning (value = "pointCut ()") private void process (joinpoint joinpoint) {methodSignature signature = (methodSignature) joinpoint.getSignature (); 메소드 메소드 = signature.getMethod (); Cacheremove Cacheremove = method.getAntantation (cacheremove.class); if (cacheremove! = null) {String value = cacheremove.value (); 문자열 [] keys = cacheremove.key (); // 제거 해야하는 일반 키 목록 Cachekeys = CacheUtils.cachekeys (value); for (문자열 키 : 키) {Pattern Pattern = Pattern.comPile (키); 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"); 공개 정적 개체 get (String Cacheame, String Key) {element element = getCache (Cachename) .get (키); 반환 요소 == null? NULL : element.getObjectValue (); } public static void put (문자열 캐시 이름, 문자열 키, 객체 값) {요소 요소 = 새 요소 (키, 값); getCache (Cachename) .put (요소); } public static void 제거 (문자열 캐시 이름, 문자열 키) {getCache (캐시 이름) .remove (키); } public static list cachekeys (String Cachename) {return getCache (cachename) .getKeys (); } /*** 아무도 생성되지 않으면 캐시를받습니다. * @param cachename * @return */ private static cache getCache (String Cachename) {캐시 캐시 = Cachemanager.getCache (Cachename); if (cache == null) {cachemanager.addcache (cachename); cache = cachemanager.getCache (캐시 이름); cache.getCacheConfiguration (). seteternal (true); } 반환 캐시; } public static cachemanager getCacheManager () {return cachemanager; }}이 시점에서 전체 Ehcache 퍼지 배치 제거 기능이 구현됩니다.
요약
전체 프로세스에는 간단한 아이디어가 있으며 AOP 지식을 사용한 후 필요한 기능이 완료됩니다. 그러나 일부 코드의 특정 제거는 최적화를 위해 고려 될 수 있습니다. 모든 캐시 루프를 통해 제거 해야하는 모든 캐시는 제거됩니다. 이와 같은 여러 키가 있다고 생각하는 대신 전체 캐시가 여러 번 트래버됩니다. 특정 구현은 독자에게 완료하도록 맡겨집니다. 그것이 당신에게 도움이되기를 바랍니다. 또한 모두가 wulin.com을 더 지원하기를 바랍니다.