Dev/Spring

[Spring] EHCache

창문닦이 2020. 5. 6. 15:21

DB에서 조회하는 데 소요되는 리소스를 줄이고 이중화된 서버 간 분산 캐시된 내용을 공유 위해 EHCache를 사용했다.

관련 내용을 공부하고자 정리한다!

 

Ehcache

  • EHCache는 Spring Cache의 대표격으로 오픈 소스 기반의 Local Cache이다.
  • Java 제네릭을 활용하고 캐시 상호 작용을 단순화하는 개선 된 API
  • javax.cache API (JSR-107)와의 완벽한 호환성 (스프링 캐싱 및 최대 절전 모드 통합)
  • 오프 힙 전용 캐시를 포함한 오프 힙 스토리지 기능
  • Disk, Memory 저장이 가능한 형태

 

MAVEN Dependency

    <dependency>
      <groupId>org.ehcache</groupId>
      <artifactId>ehcache</artifactId>
      <version>3.8.1</version>
    </dependency> 

 

XML configuration

heap과 같은 환경 설정을 xml로 진행해도 되고 자바 코드로 진행해도된다

<config
    xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
    xmlns='http://www.ehcache.org/v3'
    xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core.xsd">

  <cache alias="foo"> 
    <key-type>java.lang.String</key-type> 
    <value-type>java.lang.String</value-type> 
    <resources>
      <heap unit="entries">20</heap> 
      <offheap unit="MB">10</offheap> 
    </resources>
  </cache>

  <cache-template name="myDefaults"> 
    <key-type>java.lang.Long</key-type>
    <value-type>java.lang.String</value-type>
    <heap unit="entries">200</heap>
  </cache-template>

  <cache alias="bar" uses-template="myDefaults"> 
    <key-type>java.lang.Number</key-type>
  </cache>

  <cache alias="simpleCache" uses-template="myDefaults" /> 

</config>

 

EHCACHE XML 설정 시 속성 설명

name 코드에서 사용할 캐시 name 디폴트
maxEntriesLocalHeap 메모리에 생성 될 최대 캐시 갯수 0
maxEntriesLocalDisk 디스크에 생성 될 최대 캐시 갯수 0
eternal 영속성 캐시 설정 (지워지는 캐시인지?) <br />external = "true"이면, timeToIdleSecond, timeToLiveSeconds 설정이 무시됨 false
timeToIdleSecond 해당 초동안 캐시가 호출 되지 않으면 삭제 0
timeToLiveSeconds 해당 초가 지나면 캐시가 삭제 0
overflowToDisk 오버플로우 된 항목에 대해 disk에 저장할 지 여부 false
diskPersistent 캐시를 disk에 저장하여, 서버 로드 시 캐시를 말아 둘지 설정 false
diskExpiryThreadIntervalSeconds Disk Expiry 스레드의 작업 수행 간격 설정 0
memoryStoreEvictionPolicy 캐시의 객체 수가 maxEntriesLocalHeap에 도달하면, 객체를 추가하고 제거하는 정책 설정

LRU : 가장 오랫동안 호출 되지 않은 캐시를 삭제
LFU : 호출 빈도가 가장 적은 캐시를 삭제
FIFO : First In First Out, 캐시가 생성된 순서대로 가장 오래된 캐시를 삭제
LRU

 

pubic class CacheConfiguration {

	private UserManagedCache<String, String> customCache;
    
    public void initialize() {
      CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
            .withCache("preConfigured",CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class
                                                                 ,String.class
                                                                 ,ResourcePoolsBuilder.heap(100))
                                                                 .build())
            .build(true);
	}
}
Cache<Long, String> preConfigured = cacheManager.getCache("preConfigured", Long.class, String.class);

// 캐시 생성
Cache<Long, String> myCache = cacheManager.createCache("myCache",
		CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,
		ResourcePoolsBuilder.heap(100)).build());
// 캐시 입력
myCache.put(1L, "da one!");

// 캐시 조회
String value = myCache.get(1L);

// 캐시 사용 종료
cacheManager.close();

 

Reference

https://www.ehcache.org/documentation/3.8/getting-started.html

https://jaehun2841.github.io/2018/11/07/2018-10-03-spring-ehcache/#spring-cache-annotation

https://jojoldu.tistory.com/57

 

 

'Dev > Spring' 카테고리의 다른 글

[Spring] @Valid, @Validated 활용  (0) 2020.07.15
[Spring] Annotation 간략 정리  (0) 2019.12.11
Spring3.0 - Spring WEB MVC  (0) 2019.04.19
Spring3.0 - MVC web & MyBatis  (0) 2019.04.18
Spring3.0 - MVC web & JDBC 게시판만들기  (0) 2019.04.18