ehcache工具类与配置
来源:互联网 发布:java调用类的构造器 编辑:程序博客网 时间:2024/06/03 19:34
1.ehcache工具类
package com.ai.ecsite.ehcache.utils;import com.ai.ecsite.util.common.SpringContextHolder;import com.ai.ecsite.util.common.StringUtils;import net.sf.ehcache.Cache;import net.sf.ehcache.CacheManager;import net.sf.ehcache.Element;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.cache.ehcache.EhCacheCacheManager;/** * ehcache工具类 * * Created by huxin on 2016/12/26. */public class EhcacheUtils { private final static Logger logger = LoggerFactory.getLogger(EhcacheUtils.class); // 得到ehcache缓存管理器 private static EhCacheCacheManager ehCacheCacheManager; // ehcache缓存管理器 private static CacheManager cacheManager; /** * 初始化工具类 */ private EhcacheUtils(String configuration){ // 如果在spring中有配置ehcache,那么由spring托管 try { ehCacheCacheManager = SpringContextHolder.getBean(EhCacheCacheManager.class); } catch (Exception e) { logger.warn("spring doesn't inject ehcache bean"); } // 如果spring有托管ehcahce,那么由spring容器中得到ehcache管理器 if (ehCacheCacheManager != null){ cacheManager = ehCacheCacheManager.getCacheManager(); }else{ if (StringUtils.isNotEmpty(configuration)){ cacheManager = CacheManager.newInstance(configuration); }else{ // 如果配置文件不为空 cacheManager = CacheManager.getInstance(); } } } /** * 初始化工具类 */ private EhcacheUtils(){ new EhcacheUtils(null); } /** * 得到工具类实例 * * @return */ public static void initCacheManager(String configuration){ // 如果缓存工类灯为空 if (cacheManager == null){ // 如果指定了配置文件 new EhcacheUtils(configuration); } } /** * 得到工具类实例 * * @return */ public static void initCacheManager(){ // 如果缓存工类灯为空 if (cacheManager == null){ initCacheManager(null); } } /** * 在指定的缓存中塞入需要缓存值 * * @param cacheInstanceName 缓存实例名称 * @param key 缓存键 * @param cacheValue 缓存值 */ public static void put (String cacheInstanceName, Object key, Object cacheValue){ if (cacheManager == null){ initCacheManager(); } // 按缓存实例名取出一个缓存 Cache cache = cacheManager.getCache(cacheInstanceName); // 如果待操作的缓存不存在,那么创建一个 if (cache == null){ // 创建缓存 cacheManager.addCache(cacheInstanceName); cache = cacheManager.getCache(cacheInstanceName); } // 构建缓存键值到 Element element = new Element(key, cacheValue); // 缓存信息置入缓存中 cache.put(element); } /** * 从缓存实例中取出缓存信息 * * @para cacheInstanceName 缓存实例名 * @param key 缓存键 * @return */ public static Object get (String cacheInstanceName, Object key){ if (cacheManager == null){ initCacheManager(); } // 根据缓存实例名取出缓存信息 Cache cache = cacheManager.getCache(cacheInstanceName); // 如果没有指定的缓存实例,返回空 if (cache == null){ logger.warn("cache instance doesn't exists!"); return null; } Element element = cache.get(key); return element == null ? null : element.getObjectValue(); } /** * 删除缓存实例信息 * * @param cacheInstanceName 缓存实例名称 * @return 操作结果 true-删除成功 false-删除失败 */ public static boolean removeCacheInstance (String cacheInstanceName){ try { // 如果ehcache管理器为空,那么实始化管理器实例 if (cacheManager == null){ initCacheManager(); } // 缓存缓存实例 cacheManager.removeCache(cacheInstanceName); return true; } catch (IllegalStateException e) { logger.error("remove cache instance error!", e); } return false; } /** * 根据键删除指定缓存实例缓存 * @param cahceInstanceName ehcache实例名 * @param key 缓存键 */ public static void remove (String cahceInstanceName, Object key){ if (cacheManager == null){ initCacheManager(); } // 根据缓存实例名称得到缓存 Cache cache = cacheManager.getCache(cahceInstanceName); // 如果缓存不为空,那么创建缓存实例 if (cache != null){ cache.remove(key); } } /** * 创建缓存实例 * * @param cacheName 级存实例名称 * @param maxElementsInMemory 缓存实例存储最大元素数 * @param overflowToDisk 是否持久化到硬盘 * @param eternal 是否会自动死亡 * @param timeToLiveSeconds 最大生存时间,当external为true时有效 * @param timeToIdleSeconds 最大空闲时间,超过之后自动消亡,当external为true时有效 * * @return 缓存实例对象 */ public static Cache initCache(String cacheName, int maxElementsInMemory, boolean overflowToDisk, boolean eternal, long timeToLiveSeconds, long timeToIdleSeconds) throws Exception { // 如果缓存管理理器未初始化 if (cacheManager == null){ initCacheManager(); } try { // 首先根据缓存实例的名称从理器里获取缓存信息 Cache myCache = cacheManager.getCache(cacheName); // 如果缓存实例不存在 if (myCache == null) { // 创建缓存实例 Cache memoryOnlyCache = new Cache(cacheName, maxElementsInMemory, overflowToDisk, eternal, timeToLiveSeconds, timeToIdleSeconds); // 将缓存加入管理器中 cacheManager.addCache(memoryOnlyCache); // 获取缓存 myCache = cacheManager.getCache(cacheName); } return myCache; } catch (Exception e) { logger.error("init cache " + cacheName + " failed!!!", e); throw new Exception("创建缓存实例失败"); } }}
ehcache配置文件
配置项
描述
1
name
缓存名称
2
maxElementsInMemory
缓存元素的最大数
3
eternal
是否自动失效:true-自动失效;false-不自动失效
4
timeToIdleSeconds
空闲最大时间,当空闲时间超过设定时间后该元素失效,如果该属性设置为0,表示缓存的闲置时间无穷大,当eternal配置为true时有效
5
timeToLiveSeconds
最大有效时间,当超过设定时间后该元素失效,如果该属性设置为0,表示缓存的有效时间无穷大,当eternal配置为true时有效
6
overflowToDisk
当元素溢出时是否保存到硬盘
7
diskSpoolBufferSizeMB
置磁盘缓存区大小
8
maxElementsOnDisk
硬盘最大缓存个数
9
diskPersistent
否缓存虚拟机重启期数据,默认false
10
diskExpiryThreadIntervalSeconds
磁盘失效线程运行时间间隔,默认120秒
11
memoryStoreEvictionPolicy
达到maxElementsInMemory限制时,Ehcache将会根据指 定的策略去清理内存,默认策略是LRU。
LRU:最近最少使用;
FIFO:先进先出;
LFU:较少使用。
12
clearOnFlush
内存数量最大时,是否清除
其详细配置见cache.xml
<?xml version="1.0" encoding="UTF-8" ?><ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"> <!-- 默认缓存 --> <defaultCache maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false"/> <cache name="test" maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false"/></ehcache>
spring与ehcache集成
1. 将ehcache让spring进行统一管理,指定缓存管理器,以及缓存工厂
<cache:annotation-drivencache-manager="cacheManager"/>
<!-- cachefactory -->
<beanid="cacheManagerFactory"class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<propertyname="configLocation">
<value>classpath:cache.xml</value>
</property>
</bean>
<bean id="cacheManager"class="org.springframework.cache.ehcache.EhCacheCacheManager">
<propertyname="cacheManager" ref="cacheManagerFactory"/>
</bean>
2. 用注解对缓存进行操作:
Ø Cacheable:用Cacheable注解标记的方法会在执行之后将结果缓存到ehcache中。Value指定缓存数据的缓存名称(在cache.xml中配置),key指定缓存数据的键,condition属性指定缓存动作发生的条件。缓存的键支持SpringEL表达式:
属性名称
描述
示例
methodName
当前方法名
#root.methodName
method
当前方法
#root.method.name
target
当前被调用的对象
#root.target
targetClass
当前被调用的对象的class
#root.targetClass
args
当前方法参数组成的数组
#root.args[0]
caches
当前被调用的方法使用的Cache
#root.caches[0].name
@Cacheable(value = "exceptionCache", key ="'sys_exception_cache'")
@Override
public Map<String, String> getData (){…}
Ø CacheEvict:用来标记需要清除缓存元素的方法或类上。
allEntries:表示是否需要清除缓存中的所有元素;
beforeInvocation:当该属性值为true时,在执行目标方法前清除缓存。
Ø Caching:可以在一个方法或类上同时指定多个SpringCache的相关注解
Ø CachePut:这个注释可以确保方法被执行,同时方法的返回值也被记录到缓存中
- ehcache工具类与配置
- ehcache 缓存工具类
- Ehcache 工具类
- EHCache工具类
- Ehcache工具类 EhcacheUtil
- Ehcache与terracotta集群配置
- Ehcache与terracotta集群配置
- Ehcache与terracotta集群配置
- Ehcache封装的工具类
- 工具类:ehCache,用于缓存
- 工具类:ehCache,用于缓存
- 自己动手写ehcache工具类和配置文件ehcache.xml
- Spring与Ehcache简单自定义监听器配置
- Spring与Ehcache简单自定义监听器配置
- EHcache配置
- ehcache配置
- Ehcache配置
- ehcache配置
- angualr学习笔记3-angular模型(model)
- 匹配一句话中的数字并提取出来
- 欢迎使用CSDN-markdown编辑器
- linux vi编辑器显示行号
- 事务和锁
- ehcache工具类与配置
- 透明度无法设置
- 23种设计模式(12):策略模式
- KMP字符串模式匹配详解
- GitHub使用教程for Eclipse
- HEXO搭建个人博客
- table中元素的border不显示问题
- React Native跳转第三方APP
- inand驱动问题的解决+一些小问题的修补