기본 요소 : 버전, 개념 및 추상
- 으로 Ehcache 3.x의는 자바 언어의 라이브러리 캐시의 구현이며, 실현 JSR107 사양을
- 가된다 org.ehcache 2.X ::으로 Ehcache :으로 Ehcache 3.x를 2.X에서 3.X에, 메이븐 의존 net.sf.ehcache에서으로 Ehcache 업그레이드 후
- 으로 Ehcache 기본 개념은 다음과 같습니다 :
- 객체는 "키 - 값 쌍을"캐시에
- 키 - 값 쌍의 용기는 "캐시 캐시"입니다
- 각 캐시는 CacheConfigurationBuilder에 의해 건설 자체 구성이다 "캐시 구성 CacheConfiguration"을 가지고
- 으로 Ehcache는 여러 캐시하는 '캐시 관리자 CacheManager "에 대한 필요성을 관리 할 수 있습니다. 당신은 만들 수 있습니다 또는 이름 CacheManager + 캐시 캐시 확보 하
- 저장 위치 캐시 객체는 다음과 같습니다 힙 메모리 힙, 외부 힙 메모리 offheap, 하드 디스크. offheap JVM 메모리를 외부에 위치하고, GC 관리하지
프로그래밍 방식으로 캐시를 만들기
의존의 도입
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.8.0</version>
</dependency>
테스트 코드
@Test
public void testA() {
CacheManagerBuilder builder = CacheManagerBuilder.newCacheManagerBuilder();
CacheManager cacheManager = builder.build();
cacheManager.init();//cacheManager创建后一定要初始化
ResourcePoolsBuilder poolsBuilder = ResourcePoolsBuilder.newResourcePoolsBuilder();
ResourcePools pools = poolsBuilder.heap(10, EntryUnit.ENTRIES).build();//用于配置一个cache的heap/offheap/disk的容量.
CacheConfigurationBuilder<Long, String> cacheConfigBuilder = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, pools);
CacheConfiguration<Long, String> cacheConfiguration = cacheConfigBuilder.build();//创建一个缓存配置
Cache myCache = cacheManager.createCache("myCache", cacheConfiguration);//根据缓存名称和缓存配置创建缓存
myCache.put(1L, "hahaha");
logger.info("{}", myCache.get(1L));
cacheManager.close();//系统关闭时, 应调用cacheManager的close方法
}
XML을 통해 캐시 구성을 만듭니다
으로 Ehcache XML 구성 :
<?xml version="1.0" encoding="UTF-8" ?>
<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-template模板 -->
<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="foo">
<key-type>java.lang.String</key-type>
<value-type>java.lang.String</value-type>
<resources>
<heap unit="entries">20</heap> <!-- heap可以存储20个元素 -->
<offheap unit="MB">10</offheap> <!-- offheap可以存储10MB -->
</resources>
</cache>
<!-- 继承cache-template模板 -->
<cache alias="bar" uses-template="myDefaults">
<key-type>java.lang.Number</key-type>
</cache>
<cache alias="simpleCache" uses-template="myDefaults" />
</config>
테스트 코드 :
@Test
public void testB() {
URL ehcacheConfigUrl = getClass().getResource("/ehcache.xml");
Configuration configuration = new XmlConfiguration(ehcacheConfigUrl); //从XML配置改造缓存配置
CacheManager cacheManager = CacheManagerBuilder.newCacheManager(configuration);//创建CacheManager
cacheManager.init();
Cache<String, String> foo = cacheManager.getCache("foo", String.class, String.class);//从CachaManager用缓存名称获取缓存
foo.put("1", "hehehe");
logger.info("{}", foo.get("1"));
Cache<Number, String> bar = cacheManager.getCache("bar", Number.class, String.class);
bar.put(1, "hohoho");
logger.info("{}", bar.get(1));
cacheManager.close();
}
으로 Ehcache 캐시는 JSR107 (JCache) API를 통해 얻을 - 프로그램
@Test
public void testA() {
//CachingProvider provider = Caching.getCachingProvider("org.ehcache.jsr107.EhcacheCachingProvider");
CachingProvider provider = Caching.getCachingProvider();//通过spi技术找到provider. 适用于类路径中只有一个JCache实现, 否则得用上面一行代码指明provider
CacheManager cacheManager = provider.getCacheManager();
ResourcePoolsBuilder poolsBuilder = ResourcePoolsBuilder.newResourcePoolsBuilder();
ResourcePools pools = poolsBuilder.heap(10, EntryUnit.ENTRIES).build();
CacheConfigurationBuilder<Long, String> configBuilder = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, pools);
CacheConfiguration<Long, String> cacheConfig = configBuilder.build();//ehcache的configuration
Cache<Long, String> cache = cacheManager.createCache("myCache", Eh107Configuration.fromEhcacheCacheConfiguration(cacheConfig));//通过Eh107Configuration将ehcache的config转为jcache的config
cache.put(1L, "hahaha");
logger.info("{}", cache.get(1L));
cacheManager.close();
}
으로 Ehcache는 API를 캐시 구성의 JSR107 (JCache)에 인수 --xml
JSR107 사양의 도입
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
<version>1.1.1</version>
</dependency>
위의 사용으로 Ehcache XML 구성
테스트 코드를 :
@Test
public void testB() throws Exception {
CachingProvider provider = Caching.getCachingProvider("org.ehcache.jsr107.EhcacheCachingProvider");
URI uri = getClass().getResource("/ehcache.xml").toURI();
CacheManager cacheManager = provider.getCacheManager(uri, getClass().getClassLoader());
Cache<String, String> cache = cacheManager.getCache("foo", String.class, String.class);
cache.put("1", "hehehe");
logger.info("{}", cache.get("1"));
cacheManager.close();
}
스프링으로 Ehcache JCache에 주입함으로써
Spring XML 설정
<bean id="jCacheManager" class="org.springframework.cache.jcache.JCacheManagerFactoryBean">
<property name="cacheManagerUri" value="classpath:ehcache.xml" />
</bean>
<bean id="cacheManager" class="org.springframework.cache.jcache.JCacheCacheManager">
<property name="cacheManager" ref="jCacheManager" />
</bean>
테스트 코드 :
@ContextConfiguration("classpath:spring.xml")
public class SpringJcacheEhcacheTest extends AbstractTestNGSpringContextTests {
private static final Logger logger = LoggerFactory.getLogger(SpringJcacheEhcacheTest.class);
@Autowired
private CacheManager cacheManager;
@Test
public void testA() {
Cache<Number, String> barCache = cacheManager.getCache("bar", Number.class, String.class);
barCache.put(1, "hahaha");
barCache.put(2L, "hehehe");
logger.info("{}", barCache.get(1));
logger.info("{}", barCache.get(2L));
cacheManager.close();
}
}
기타 - 봄의 주입으로 Ehcache 2.x에서
도입 Ehcache2.x
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.6</version>
</dependency>
으로 Ehcache 2.x를 구성
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false" monitoring="autodetect" dynamicConfig="true">
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
<cache name="foo"
eternal="false"
timeToLiveSeconds="300"
maxElementsInMemory="2000"
maxElementsOnDisk="20000"
overflowToDisk="true"
diskPersistent="true"
memoryStoreEvictionPolicy="FIFO"/>
</ehcache>
스프링 XML 구성
<bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:ehcache-2.x.xml"/>
</bean>
<bean id="cacheManager2.x" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<property name="cacheManager" ref="cacheManagerFactory"/>
</bean>
테스트 코드 :
@ContextConfiguration("classpath:spring.xml")
public class SpringEhcache2xTest extends AbstractTestNGSpringContextTests {
private static final Logger logger = LoggerFactory.getLogger(SpringEhcache2xTest.class);
@Autowired
private EhCacheCacheManager ehCacheCacheManager;
@Test
public void testA() {
CacheManager cacheManager = ehCacheCacheManager.getCacheManager();
Cache cache = cacheManager.getCache("foo");
Element ele = new Element(1L, "Ehcache 2.x");
cache.put(ele);
logger.info("{}", cache.get(1L).getObjectValue());
cacheManager.shutdown();
}
}
최종적으로
으로 Ehcache 3.x의 공식 문서 : http://www.ehcache.org/documentation/3.8/getting-started.html
전체 코드 : https://github.com/JamboSonng/Demo-Master/tree/master/Master-Ehcache