Ehcache 소개

1. 개요

이 기사에서는 널리 사용되는 오픈 소스 Java 기반 캐시 인 Ehcache를 소개합니다. 메모리 및 디스크 저장소, 리스너, 캐시 로더, RESTful 및 SOAP API 및 기타 매우 유용한 기능을 제공합니다.

캐싱이 애플리케이션을 최적화하는 방법을 보여주기 위해 제공된 숫자의 제곱 값을 계산하는 간단한 방법을 만들 것입니다. 각 호출에서 메서드는 calculateSquareOfNumber (int number) 메서드를 호출 하고 정보 메시지를 콘솔에 인쇄합니다.

이 간단한 예에서는 제곱 값 계산이 한 번만 수행되고 동일한 입력 값을 가진 다른 모든 호출이 캐시에서 결과를 반환 함을 보여주고 싶습니다.

우리가 전적으로 Ehcache 자체에 초점을 맞추고 있다는 사실을 알아 두는 것이 중요합니다 (Spring없이); Ehcache가 Spring과 어떻게 작동하는지 알고 싶다면이 기사를 읽어보세요.

2. Maven 종속성

Ehcache를 사용하려면 다음 Maven 종속성을 추가해야합니다.

 org.ehcache ehcache 3.1.3 

최신 버전의 Ehcache 아티팩트는 여기에서 찾을 수 있습니다.

3. 캐시 구성

Ehcache는 두 가지 방법으로 구성 할 수 있습니다.

  • 첫 번째 방법은 모든 구성 매개 변수가 Ehcache API를 통해 구성되는 Java POJO를 사용하는 것입니다.
  • 두 번째 방법은 제공된 스키마 정의에 따라 Ehcache를 구성 할 수있는 XML 파일을 통한 구성입니다.

이 기사에서는 두 가지 접근 방식 (Java 및 XML 구성)을 모두 보여줍니다.

3.1. 자바 구성

이 하위 섹션에서는 POJO로 Ehcache를 구성하는 것이 얼마나 쉬운 지 보여줍니다. 또한 더 쉬운 캐시 구성 및 가용성을 위해 도우미 클래스를 만들 것입니다.

public class CacheHelper { private CacheManager cacheManager; private Cache squareNumberCache; public CacheHelper() { cacheManager = CacheManagerBuilder .newCacheManagerBuilder().build(); cacheManager.init(); squareNumberCache = cacheManager .createCache("squaredNumber", CacheConfigurationBuilder .newCacheConfigurationBuilder( Integer.class, Integer.class, ResourcePoolsBuilder.heap(10))); } public Cache getSquareNumberCacheFromCacheManager() { return cacheManager.getCache("squaredNumber", Integer.class, Integer.class); } // standard getters and setters }

캐시를 초기화하려면 먼저 Ehcache CacheManager 객체 를 정의해야 합니다. 이 예에서는 newCacheManagerBuilder () API를 사용하여 기본 캐시 squaredNumber” 를 생성합니다 .

캐시는 단순히 Integer 키를 Integer 값에 매핑 합니다.

정의 된 캐시를 사용하기 전에 init () 메서드를 사용하여 CacheManager 객체 를 초기화해야하는 방법에 유의하십시오 .

마지막으로 캐시를 얻으려면 제공된 캐시의 이름, 키 및 값 유형과 함께 getCache () API를 사용할 수 있습니다 .

이 몇 줄을 사용하여 이제 애플리케이션에서 사용할 수있는 첫 번째 캐시를 만들었습니다.

3.2. XML 구성

하위 섹션 3.1의 구성 개체. 다음 XML 구성을 사용하는 것과 같습니다.

 java.lang.Integer java.lang.Integer 10 

이 캐시를 Java 애플리케이션에 포함하려면 Java로 XML 구성 파일을 읽어야합니다.

URL myUrl = getClass().getResource(xmlFile); XmlConfiguration xmlConfig = new XmlConfiguration(myUrl); CacheManager myCacheManager = CacheManagerBuilder .newCacheManager(xmlConfig);

4. Ehcache 테스트

섹션 3에서는 목적에 맞게 단순 캐시를 정의하는 방법을 보여주었습니다. 캐싱이 실제로 작동하는지 보여주기 위해 제공된 입력의 제곱 값을 계산하고 계산 된 값을 캐시에 저장하는 SquaredCalculator 클래스를 만듭니다 .

물론 캐시에 이미 계산 된 값이 포함되어있는 경우 캐시 된 값을 반환하고 불필요한 계산을 방지합니다.

public class SquaredCalculator { private CacheHelper cache; public int getSquareValueOfNumber(int input) { if (cache.getSquareNumberCache().containsKey(input)) { return cache.getSquareNumberCache().get(input); } System.out.println("Calculating square value of " + input + " and caching result."); int squaredValue = (int) Math.pow(input, 2); cache.getSquareNumberCache().put(input, squaredValue); return squaredValue; } //standard getters and setters; }

테스트 시나리오를 완료하려면 제곱 값을 계산하는 코드도 필요합니다.

@Test public void whenCalculatingSquareValueAgain_thenCacheHasAllValues() { for (int i = 10; i < 15; i++) { assertFalse(cacheHelper.getSquareNumberCache().containsKey(i)); System.out.println("Square value of " + i + " is: " + squaredCalculator.getSquareValueOfNumber(i) + "\n"); } for (int i = 10; i < 15; i++) { assertTrue(cacheHelper.getSquareNumberCache().containsKey(i)); System.out.println("Square value of " + i + " is: " + squaredCalculator.getSquareValueOfNumber(i) + "\n"); } }

테스트를 실행하면 콘솔에 다음 결과가 표시됩니다.

Calculating square value of 10 and caching result. Square value of 10 is: 100 Calculating square value of 11 and caching result. Square value of 11 is: 121 Calculating square value of 12 and caching result. Square value of 12 is: 144 Calculating square value of 13 and caching result. Square value of 13 is: 169 Calculating square value of 14 and caching result. Square value of 14 is: 196 Square value of 10 is: 100 Square value of 11 is: 121 Square value of 12 is: 144 Square value of 13 is: 169 Square value of 14 is: 196

알다시피, calculate () 메서드는 첫 번째 호출에서만 계산을 수행했습니다. 두 번째 호출에서 모든 값이 캐시에서 발견되어 반환되었습니다.

5. 기타 Ehcache 구성 옵션

이전 예제에서 캐시를 만들었을 때 특별한 옵션이없는 단순한 캐시였습니다. 이 섹션에서는 캐시 생성에 유용한 다른 옵션을 보여줍니다.

5.1. 디스크 지속성

캐시에 저장할 값이 너무 많으면 해당 값 중 일부를 하드 드라이브에 저장할 수 있습니다.

PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder() .with(CacheManagerBuilder.persistence(getStoragePath() + File.separator + "squaredValue")) .withCache("persistent-cache", CacheConfigurationBuilder .newCacheConfigurationBuilder(Integer.class, Integer.class, ResourcePoolsBuilder.newResourcePoolsBuilder() .heap(10, EntryUnit.ENTRIES) .disk(10, MemoryUnit.MB, true)) ) .build(true); persistentCacheManager.close();

기본 CacheManager 대신 메모리에 저장할 수없는 모든 값을 유지 하는 PersistentCacheManager 를 사용 합니다.

구성에서 캐시가 10 개의 요소를 메모리에 저장하고 지속성을 위해 하드 드라이브에 10MB를 할당 함을 알 수 있습니다.

5.2. 데이터 만료

많은 데이터를 캐시하는 경우 캐시 된 데이터를 일정 시간 동안 저장하여 큰 메모리 사용을 피할 수 있습니다.

Ehcache는 만료 인터페이스를 통해 데이터 최신 성을 제어합니다 .

CacheConfiguration cacheConfiguration = CacheConfigurationBuilder .newCacheConfigurationBuilder(Integer.class, Integer.class, ResourcePoolsBuilder.heap(100)) .withExpiry(Expirations.timeToLiveExpiration(Duration.of(60, TimeUnit.SECONDS))).build();

이 캐시에서 모든 데이터는 60 초 동안 유지되며 그 시간이 지나면 메모리에서 삭제됩니다.

6. 결론

이 기사에서는 Java 애플리케이션에서 간단한 Ehcache 캐싱을 사용하는 방법을 보여주었습니다.

이 예에서는 단순히 구성된 캐시로도 불필요한 작업을 많이 줄일 수 있음을 알았습니다. 또한 POJO 및 XML을 통해 캐시를 구성 할 수 있으며 Ehcache에는 지속성 및 데이터 만료와 같은 몇 가지 멋진 기능이 있음을 보여주었습니다.

항상 그렇듯이이 기사의 코드는 GitHub에서 찾을 수 있습니다.