ehcache之常用配置大全,详解,以及注意事项,范例以及工具类。

it2022-05-05  140

环境:ssm框架+ehcache2.8.1

集成方法自行百度

常用配置大全:

maxBytesLocalHeap:限制堆内存字节大小 maxBytesLocalOffHeap:限制非堆内存字节大小 maxBytesLocalDisk:限制磁盘可使用字节大小 maxEntriesLocalDisk:硬盘最大缓存个数 name:缓存名称。  maxElementsInMemory:缓存最大个数。  eternal:对象是否永久有效,一但设置了,timeout将不起作用。  timeToIdleSeconds:设置对象在失效前的允许闲置时间单位秒。仅当eternal=false对象不是永久有效时使用可选属性默认值是0也就是可闲置时间无穷大。  timeToLiveSeconds:设置对象在失效前允许存活时间单位秒。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用默认是0.也就是对象存活时间无穷大。  overflowToDisk:当内存中对象数量达到maxElementsInMemory时Ehcache将会对象写到磁盘中。  diskSpoolBufferSizeMB:这个参数设置DiskStore磁盘缓存的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。  maxElementsOnDisk:硬盘最大缓存个数。  diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.  diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔默认是120秒。  memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出),或是LFU(较少使用)。  clearOnFlush:内存数量最大时是否清除。  <diskStore>: 当内存缓存中对象数量超过maxElementsInMemory时,将缓存对象写到磁盘缓存中(需对象实现序列化接口)   <diskStore path="">: 用来配置磁盘缓存使用的物理路径,Ehcache磁盘缓存使用的文件后缀名是*.data和*.index  maxEntriesLocalHeap:是用来限制当前缓存在堆内存上所能保存的最大元素数量的。  范例: <?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"          xsi:noNamespaceSchemaLocation="ehcache.xsd"          updateCheck="true" monitoring="autodetect"          dynamicConfig="true">          <diskStore path="java.io.tmpdir"/>         <defaultCache             maxEntriesLocalHeap="10000"             eternal="false"             overflowToDisk="false"              timeToIdleSeconds="120"             timeToLiveSeconds="120"             diskSpoolBufferSizeMB="30"             maxEntriesLocalDisk="10000000"             diskExpiryThreadIntervalSeconds="120"             memoryStoreEvictionPolicy="LRU">         <persistence strategy="localTempSwap"/>     </defaultCache>         <cache name="myCache"            maxEntriesLocalHeap="10000"            maxEntriesLocalDisk="1000"            eternal="false"            diskSpoolBufferSizeMB="30"            timeToIdleSeconds="300"            timeToLiveSeconds="600"            memoryStoreEvictionPolicy="LFU"            transactionalMode="off">         <persistence strategy="localTempSwap"/>     </cache>     </ehcache>

 

理论分析:

ehcache配置分为两个级别:全局共享的CacheManager级别,自定义缓存的Cache级别。

CacheManager级别 所有cache共享

常用配置及注意事项:

 maxBytesLocalHeap是用来限制缓存所能使用的堆内存的最大字节数的,其单位可以是K、M或G,不区分大小写。默认是0表示不限制;其必须在每一个Cache上指定maxBytesLocalHeap或maxEntriesLocalHeap。  maxBytesLocalOffHeap是用来限制缓存所能使用的非堆内存的最大字节数,其单位也可以是K、M或G。默认是0表示不限制。但是当我们在CacheManager级别指定了maxBytesLocalOffHeap时就会隐式的使所有Cache级别的overflowToOffHeap为true,在Cache级别使用该属性时只会使当前Cache的overflowToOffHeap为true。

 maxBytesLocalDisk是用来限制缓存所能使用的磁盘的最大字节数的,其单位可以是K、M或G。默认是表示不限制。只有在单机环境下才可以使用本地磁盘,分布式环境下是不可以使用的。另外,这个设置只适用于临时将缓存内的信息写入到磁盘的情况,对于持久化缓存信息到磁盘的情况是不适用的。Cache级别的maxBytesLocalDisk同样如此。当我们在CacheManager级别指定了maxBytesLocalDisk时会隐式的指定所有Cache的overflowToDisk为true而Cache级别只会使当前Cache的overflowToDisk为true。

范例: 下面是一个在CacheManager级别指定缓存大小限制的示例,在该示例中我们指定了该CacheManager所能使用的最大堆内存是500M,最大非堆内存是2G,使用本地磁盘的最大字节数是50G。

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"      maxBytesLocalHeap="500M" maxBytesLocalOffHeap="2G" maxBytesLocalDisk="50G">   </ehcache>    

Cache级别 所有cache共享CacheManager级别设置的内容

常用配置及注意事项:

Cache级别 所有cache共享CacheManager级别设置的内容

maxEntriesLocalHeap是用来限制当前缓存在堆内存上所能保存的最大元素数量的。Ehcache规定如果在CacheManager上没有指定maxBytesLocalHeap时必须在各个Cache上指定maxBytesLocalHeap或者maxEntriesLocalHeap,但maxEntriesLocalHeap和maxBytesLocalHeap不能同时出现。也就是说我们不能在一个Cache上同时指定maxBytesLocalHeap和maxEntriesLocalHeap,当然我们也不能在Cache上指定maxEntriesLocalHeap的同时在CacheManager上指定maxBytesLocalHeap。但同时在CacheManager和Cache上指定maxBytesLocalHeap则是允许的。

maxEntriesLocalDisk是用来限制在磁盘上所能保存的元素的最大数量的。

范例: CacheManager级别指定了大小限制,同时某些Cache也指定了大小限制。如下,我们指定了cache1的maxBytesLocalHeap为200M,这个时候cache1将可以使用到200M的堆内存,而cache2和cache3将平分CacheManager级别除去cache1所拥有的200M之外的堆内存,即各150M。而CacheManager级别的offHeap和disk容量将由cache1、cache2和cache3平分,各得三分之一

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"      maxBytesLocalHeap="500M" maxBytesLocalOffHeap="5G" maxBytesLocalDisk="50G">           <cache name="cache1" maxBytesLocalHeap="200M"/>      <cache name="cache2"/>      <cache name="cache3"/>       </ehcache>  

 

 

ssm框架中的我的配置:

 

spring-context.xml中:

<!-- 缓存配置 --> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="classpath:${ehcache.configFile}" /> </bean>

config配置文件中:

ehcache.configFile=cache/ehcache-local.xml #ehcache.configFile=cache/ehcache-rmi.xml

ehcache-local.xml配置:

<?xml version="1.0" encoding="UTF-8"?> <ehcache updateCheck="false" name="defaultCache"> <diskStore path="../temp/MC/ehcache" /> <!-- 默认缓存配置. --> <defaultCache maxEntriesLocalHeap="100" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true" maxEntriesLocalDisk="100000" /> <!-- 系统缓存 --> <cache name="sysCache" maxEntriesLocalHeap="100" eternal="true" overflowToDisk="true"/> <!-- 用户缓存 --> <cache name="userCache" maxEntriesLocalHeap="100" eternal="true" overflowToDisk="true"/> <!-- 工作流模块缓存 --> <cache name="actCache" maxEntriesLocalHeap="100" eternal="true" overflowToDisk="true"/> <!-- 内容管理模块缓存 <cache name="cmsCache" maxEntriesLocalHeap="100" eternal="true" overflowToDisk="true"/> --> <!-- 系统活动会话缓存 --> <cache name="activeSessionsCache" maxEntriesLocalHeap="10000" overflowToDisk="true" eternal="true" timeToLiveSeconds="0" timeToIdleSeconds="0" diskPersistent="true" diskExpiryThreadIntervalSeconds="600"/> <!-- 简单页面缓存 <cache name="SimplePageCachingFilter" maxEntriesLocalHeap="100" eternal="false" overflowToDisk="true" timeToIdleSeconds="120" timeToLiveSeconds="120" memoryStoreEvictionPolicy="LFU"/> --> </ehcache>

 

附带工具类:

import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Element; /** * Cache工具类 * @author jeeplus * @version 2013-5-29 */ public class CacheUtils { private static CacheManager cacheManager = ((CacheManager)SpringContextHolder.getBean("cacheManager")); private static final String SYS_CACHE = "sysCache"; /** * 获取SYS_CACHE缓存 * @param key * @return */ public static Object get(String key) { return get(SYS_CACHE, key); } /** * 写入SYS_CACHE缓存 * @param key * @return */ public static void put(String key, Object value) { put(SYS_CACHE, key, value); } /** * 从SYS_CACHE缓存中移除 * @param key * @return */ public static void remove(String key) { remove(SYS_CACHE, key); } /** * 获取缓存 * @param cacheName * @param key * @return */ public static Object get(String cacheName, String key) { Element element = getCache(cacheName).get(key); return element==null?null:element.getObjectValue(); } /** * 写入缓存 * @param cacheName * @param key * @param value */ public static void put(String cacheName, String key, Object value) { Element element = new Element(key, value); getCache(cacheName).put(element); } /** * 从缓存中移除 * @param cacheName * @param key */ public static void remove(String cacheName, String key) { getCache(cacheName).remove(key); } /** * 获得一个Cache,没有则创建一个。 * @param cacheName * @return */ private static Cache getCache(String cacheName){ Cache cache = cacheManager.getCache(cacheName); if (cache == null){ cacheManager.addCache(cacheName); cache = cacheManager.getCache(cacheName); cache.getCacheConfiguration().setEternal(true); } return cache; } public static CacheManager getCacheManager() { return cacheManager; } }

 

 

遗留问题:

ehcache内部有事务机制,那么在ssm框架中如果事务回滚了,缓存却执行了,如何解决?


最新回复(0)