package com.jx.jxreserve.groupbuy.manager;
import com.jd.flash.commons.exception.BaseBusinessException;
import com.jx.jxreserve.groupbuy.common.enums.ErrorCode;
import lombok.extern.slf4j.Slf4j;
import org.ehcache.Cache;
import org.ehcache.CacheManager;
import org.ehcache.PersistentCacheManager;
import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.config.builders.CacheManagerBuilder;
import org.ehcache.config.builders.ExpiryPolicyBuilder;
import org.ehcache.config.builders.ResourcePoolsBuilder;
import org.ehcache.config.units.EntryUnit;
import org.ehcache.config.units.MemoryUnit;
import org.springframework.stereotype.Component;
import java.io.File;
import java.time.Duration;
import static org.ehcache.Status.AVAILABLE;
/**
* @author zhangpengfei9
* @version V1.0
* Ehcache的测试管理类
*/
@Slf4j
@Component
public class EhcacheTestManager {
/*************************** 1.纯内存操作 *****************************/
// 1.1 创建缓存 preConfigured 基于 内存
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
.withCache("preConfigured",
CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10)))
.build(true);
// 1.2 获取缓存实例
Cache<Long, String> preConfigured = cacheManager.getCache("preConfigured", Long.class, String.class);
/*************************** 2.新增实例 *****************************/
// 2.1 创建新的实例 并获取实例
Cache<Long, String> myCache = cacheManager.createCache("myCache",
CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10)));
/*************************** 3.三层存储 *****************************/
// 3.1 创建缓存 myData 基于 内存->堆外存储->本地磁盘
PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder()
.with(CacheManagerBuilder.persistence(new File("/home/export/App/conf/", "groupData")))
.withCache("testDiskCache",
CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,
ResourcePoolsBuilder.newResourcePoolsBuilder()
.heap(10, EntryUnit.ENTRIES)
.offheap(1, MemoryUnit.MB)
.disk(20, MemoryUnit.MB, true)
)
.withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(600))) // 设置缓存有效期
).build(true);
/*************************** 4.多个缓存 - 三层存储 *****************************/
// 4.1 一个实例管理多个缓存 并且每个缓存都可持久化到本地磁盘
PersistentCacheManager persistentCacheManager1 = CacheManagerBuilder.newCacheManagerBuilder()
.with(CacheManagerBuilder.persistence(
new File("/home/export/App/conf/").getAbsoluteFile()))
.withCache("cache1",
CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,
ResourcePoolsBuilder.newResourcePoolsBuilder()
.heap(10, EntryUnit.ENTRIES)
.offheap(1, MemoryUnit.MB)
.disk(20, MemoryUnit.MB, true)
)
)
.with(CacheManagerBuilder.persistence(
new File("/home/export/App/conf/").getAbsoluteFile()))
.withCache("cache2",
CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, Integer.class,
ResourcePoolsBuilder.newResourcePoolsBuilder()
.heap(20, EntryUnit.ENTRIES)
.offheap(2, MemoryUnit.MB)
.disk(30, MemoryUnit.MB, true)
)
)
.build(true);
/**
* 设置缓存
*/
public void setEhCache(Long key, String values) throws BaseBusinessException {
try {
// 获取存储实例 threeTieredCache
log.info("setEhCache.value:{},{}", values, key);
Cache<Long, String> testDiskCache = getManagerCache("testDiskCache");
testDiskCache.put(key, values);
} catch (Exception e) {
log.error("setEhCache failure! Exception:", e);
throw new BaseBusinessException(ErrorCode.SYSTEM_DB_ERROR.getCode(), ErrorCode.SYSTEM_DB_ERROR.getMessage());
}
}
/**
* 查询缓存
*/
public String getEhCache(Long key) throws BaseBusinessException {
try {
// 获取存储实例 threeTieredCache
log.info("getEhCache.key:{}", key);
Cache<Long, String> testDiskCache = getManagerCache("testDiskCache");
return testDiskCache.get(key);
} catch (Exception e) {
log.error("setEhCache failure! Exception:", e);
throw new BaseBusinessException(ErrorCode.SYSTEM_DB_ERROR.getCode(), ErrorCode.SYSTEM_DB_ERROR.getMessage());
}
}
/**
* 设置缓存
*/
public void closeEhCache() throws BaseBusinessException {
try {
// 获取存储实例 threeTieredCache
log.info("closeEhCache.persistentCacheManager.close1:{}", persistentCacheManager.getStatus());
persistentCacheManager.close();
log.info("closeEhCache.persistentCacheManager.close2:{}", persistentCacheManager.getStatus());
} catch (Exception e) {
log.error("setEhCache failure! Exception:", e);
throw new BaseBusinessException(ErrorCode.SYSTEM_DB_ERROR.getCode(), ErrorCode.SYSTEM_DB_ERROR.getMessage());
}
}
private Cache<Long, String> getManagerCache(String cache) {
// 3.1 创建缓存 myData 基于 内存->堆外存储->本地磁盘
log.info("persistentCacheManager.getStatus():{}", persistentCacheManager.getStatus());
if (AVAILABLE != persistentCacheManager.getStatus()) {
persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder()
.with(CacheManagerBuilder.persistence(new File("/home/export/App/conf/", "groupData")))
.withCache("testDiskCache",
CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,
ResourcePoolsBuilder.newResourcePoolsBuilder()
.heap(10, EntryUnit.ENTRIES)
.offheap(1, MemoryUnit.MB)
.disk(20, MemoryUnit.MB, true)
)
).build(true);
log.info("persistentCacheManager.getStatus1:{}", persistentCacheManager.getStatus());
}
Cache<Long, String> testDiskCache = persistentCacheManager.getCache(cache, Long.class, String.class);
return testDiskCache;
}
}
评论