본문 바로가기

Develop/Back-End

Ehcache Java에서 가장 널리 사용되는 캐시 라이브러리

이직 후 소스 분석 중 Ehcache 라이브러리를 사용한다는 것을 알게 되었습니다.
추후 다른 프로젝트에서도 자주 사용하게 될 것으로 판단 되어
공식홈페이지를 보다 매력을 느끼게 되어 정리 해보려고 합니다.
( 해당 글은 1.4.0 버전 기준으로 작성 되었습니다. 
 글 작성 기준 Ehcache 2.10.9.2 / Ehcache 3.10 릴리즈 되었으니
 하기 Reference 블럭에 공식 문서를 참고하시기 바랍니다.)
 
* cache는 거의 변경될 여지가 없는 DB 조회 결과값을 메모리 혹은 디스크에 보관하고 있다가 다시 호출되었을때는 DB 조회를 하지 않고 메모리에 있는 결과값을 그대로 사용하고자 할 때 사용 됩니다.

0. ehcache 란? 


 Ehcache는 성능을 높이고 데이터베이스를 오프로드하며 확장성을 단순화하는 오픈 소스 표준 기반 캐시입니다. 
 강력하고 입증되었으며 모든 기능을 갖추고 있으며 다른 인기 있는 라이브러리 및 프레임워크와 통합되기 때문에 가장 널리 사용되는 Java 기반 캐시입니다. 
 Ehcache는 프로세스 내 캐싱에서 테라바이트 크기의 캐시가 있는 혼합 프로세스 내/외부 프로세스 배포까지 확장됩니다

 * 라이센스 : 아파치 2.0 
 
1. ehcache 환경 설정 
 pom.xml

<!-- https://mvnrepository.com/artifact/net.sf.ehcache/ehcache -->
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>1.4.0</version>
        </dependency>

 

  
 CacheManager 기본생성자 또는 팩토리메서드가 호출되면 ehcache는 클래스 경로의 최상위 수준에서 ehcache.xml이라는  파일을 찾습니다.
 
 ehcache.xml

 <ehcache>
 	<!-- 참고1 -->
	<diskStore path="c:/test/" />
	<!-- 참고2 --> 
	<cacheManagerEventListenerFactory class="" properties=""/>
	<cacheManagerPeerProviderFactory  
		class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"  
		properties="peerDiscovery=automatic,  
		multicastGroupAddress=230.0.0.1,  
		multicastGroupPort=4446,
		timeToLive=1"
		propertySeparator="," 
	/>

	
	<!-- 참고3 -->
	<cache
        name="testCache"
        maxElementsInMemory="0"
        overflowToDisk="true"
        eternal="false"
        memoryStoreEvictionPolicy="LRU"
        timeToIdleSeconds="10"
        timeToLiveSeconds="15"
        diskPersistent="false"
		/>

 </ehcache>


[참고1]
<diskStore path="c:/test/" />
캐시 파일이 생성되는 디렉토리 경로를 설정합니다. 
경로가 Java 시스템 속성인 경우 실행중인 VM에서 해당 값으로 대체됩니다.
다음 속성이 변환됩니다. *user.home ‑ 사용자의 홈 디렉토리 *user.dir‑ 
사용자의 현재 작업 디렉토리 *java.io.tmpdir ‑ 기본 임시 파일 경로 
속성 아래에 하위 디렉토리를 지정할 수 있습니다(예: java.io.tmpdir/one).
<diskStore Path="java.io.tmpdir"/>

 

[참고2]

CacheManager에서  캐시가  추가되거나  제거될  때  알림을  받는  CacheManagerPeerProvider를  만드는  데  사용되는  CacheManagerEventListenerFactory를  지정합니다.

CacheManagerEventListenerFactory의  속성은  다음과  같습니다.  

*  class  ‑  완전한  팩토리  클래스  이름  

*  properties  ‑  팩토리에만  의미가  있는  쉼표로  구분된  속성.
CacheManager  이벤트  리스너로  등록할  정규화된  클래스  이름을  설정합니다.

이벤트에는  다음이  포함됩니다. *  캐시추가  *캐시제거
리스너  메서드에  대한  콜백은  동기식이며  동기화되지  않습니다.  청취자가  수행하는  작업에  따라  잠재적인  성능  및  스레드  안전  문제를  안전하게  처리하는  것은  구현자의  책임입니다.
클래스를  지정하지  않으면  수신기가  생성되지  않습니다.  기본값은  없습니다.

 

클러스터에서  다른  CacheManager를  검색하는  CacheManagerPeerProvider를  만드는  데  사용할  CacheManagerPeerProviderFactory를  지정합니다.

cacheManagerPeerProviderFactory의  속성은  다음과  같습니다.  

*   class  ‑  완전한  팩토리  클래스  이름  

*   properties  ‑  팩토리에만  의미가  있는  쉼표로  구분된  속성.

Ehcache는  클러스터에  참여하는  CacheManager  피어를  검색하는  두  가지  방법이  있는  내장  RMI  기반  배포  시스템과  함께  제공됩니다.  *  자동,  멀티캐스트  그룹  사용.  이것은  피어를  자동으로  발견 하고  감지합니다.
(동료가  그룹에  들어오고  나가는  것과  같은  변화)


*  수동,  수동  rmiURL  구성  사용.  피어의  하드코딩된  목록은  구성  시  제공됩니다.

 

자동  검색  구성:
자동  검색은  다음  예에  따라  구성됩니다.  

<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"  속성="peerDiscovery=자동,   multicastGroupAddress=230.0.0.1,
multicastGroupPort=4446,  timeToLive=32"/>

유효한  속성은  다음과  같습니다.  

  • *  peerDiscovery(필수)  ‑  "자동"  지정  
  • *  multicastGroupAddress(필수)  ‑  유효한  멀티캐스트  그룹  주소   지정  
  • *  multicastGroupPort(필수)  ‑  멀티캐스트  하트비트용  전용  포트  지정 트래픽
  • *  timeToLive  ‑  패킷이  전송될  거리를  결정하는  0에서  255  사이의  값을  지정합니다.

규칙에  따라  제한  사항은  다음과  같습니다.

0  ‑  같은  호스트

1  ‑  같은  서브넷
32  ‑  같은  사이트 

64  ‑  같은  지역

128  ‑  같은  대륙  

255  ‑  무제한

 

수동  검색  구성:  

수동  검색은  다음  예에  따라  구성됩니다.  

 <cacheManagerPeerProviderFactory class=
"net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=manual,
rmiUrls=//server1:40000/sampleCache1|//server2:40000/sampleCache1
| //server1:40000/sampleCache2|//server2:40000/sampleCache2"
propertySeparator="," />

유효한  속성은  다음과  같습니다.  

  • *  peerDiscovery(필수)  ‑  "manual"  지정  
  • *  rmiUrls(필수)  ‑  파이프로  구분된  rmiUrls  목록 을 //hostname:port  형식으로  지정합니다.

호스트  이름은  원격  CacheManager  피어의  호스트  이름입니다.  포트는  원격  CacheManager  피어의  RMICacheManagerPeerListener의  청취  포트입니다.

 


[참고3]
name : 캐시의 이름을 설정합니다. 캐시를 식별하는데 사용됩니다. 고유해야 합니다.
maxElementsInMemory : 메모리에 생성될 최대 개체 수를 설정합니다.
maxElementsOnDisk : DiskStore에서 유지 관리할 최대 개체 수를 설정합니다.  기본값은 0이며 무제한을 의미합니다.
eternal : 요소가 영원한지 여부를 설정합니다. 영원한 경우 제한 시간이 무시되고 요소가 만료되지 않습니다.
overflowToDisk : 메모리 저장소가 maxInMemory 제한에 도달했을 때 요소가 디스크로 오버플로될 수 있는지 여부를 설정합니다. 다음 특성 및 요소는 선택 사항입니다.
timeToIdleSeconds : 요소가 만료되기 전에 유휴 시간을 설정합니다.  즉, 요소가 만료되기 전에 액세스 사 이의 최대 시간은 요소가 영원하지 않은 경우에만 사용됩니다. 선택적 속성입니다. 값 0은 요소가 무한대로 유휴 상태일 수 있음을 의미합니다. 기본값은 0입니다.
timeToLiveSeconds : 만료되기 전에 요소의 수명을 설정합니다. 즉 생성 시간과 요소가 만료되는 시간 사이의 최대 시간입니다. 요소가 영원하지 않은 경우에만 사용됩니다. 선택적 속성입니다. 0값은 요소가 무한대로 살 수 있음을 의미합니다. 기본값은 0입니다.
diskPersistent : 가상 머신을 다시 시작하는 사이에 디스크 저장소가 지속되는지 여부. 기본값은 거짓입니다.
diskExpiryThreadIntervalSeconds : 디스크 만료 스레드 실행사이의 시간(초)입니다. 기본값은 120초입니다.
diskSpoolBufferSizeMB : 스풀 버퍼에 DiskStore를 할당하기 위한 크기입니다. 이 영역에 쓴 다음 비동기적으로 디스크에 씁니다. 기본 크기는 30MB입니다. 각 스풀 버퍼는 해당 캐시에서만 사용됩니다. OutOfMemory 오류가 발생하면 이 값을 낮추는 것이 좋습니다. DiskStore 성능을 개선하려면 성능을 높이는 것이 좋 습니다. DiskStore의 추적 수준 로깅은 백업이 발생하는지 여부를 표시합니다.
memoryStoreEvictionPolicy : maxElementsInMemory 제한에 도달하면 정책이 적용됩니다. 기본 정책은 최근 가장 적게 사용됨(LRU로 지정됨)입니다. 사용 가능한 기타 정책 ‑ 선입 선출(FIFO로 지정) 및 덜 자주 사용(LFU로 지정) 캐시 요소에는 동일한 형식의 팩토리 클래스 및 속성을 사용하는 하위 요소도 포함될 수 있습니다. 정의된 하위 요소는 다음과 같습니다.

2. 메소드 캐시저장 & 캐시조회 호출
   아래 Reference 중 Java Doc에서 해당하는 버전을 참고하여 이용하시면 됩니다.
   
사용 클래스 
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

예)
private Cache cache;


캐시 저장
cache.put(element);

캐시 조회
cache.get(key);
          


 * Reference
 https://github.com/ehcache github
 https://www.ehcache.org 공식홈페이지 
 https://javadoc.io/doc/net.sf.ehcache/ehcache/latest/index.html Java Doc

 

본문 중 틀린 내용이 있으면 언제든지 말씀해주시면 수정하도록 하겠습니다.
 
 

반응형