1.介绍
EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点。Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。ehcache 对分布式支持不够好,多个节点不能同步,通常和redis一块使用
在vm重启后,持久化到磁盘的存储可以复原数据
ehcache直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便。
redis是通过socket访问到缓存服务,效率比ecache低,比数据库要快很多,
处理集群和分布式缓存方便,有成熟的方案。如果是单个应用或者对缓存访问要求很高的应用,用ehcache。如果是大型系统,存在缓存共享、分布式部署、缓存内容很大的,建议用redis
2.ehcache.xml配置
ehchache节点
updateCheck属性,是否开启自动更新检查,默认true
dynamicConfig – 一个可选设置,设置ehcache启动后,缓存配置是否能动态改变,true:能,默认true。
子节点
diskStore
属性path :指定磁盘存储的位置
cache
自定的缓存,当自定的配置不满足实际情况时可以通过自定义(可以包含多个cache节点)
name : 缓存的名称,可以通过指定名称获取指定的某个Cache对象
maxElementsInMemory :内存中允许存储的最大的元素个数,0代表无限个
eternal :设置缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。
overflowToDisk:内存不足时,是否启用磁盘缓存
diskPersistent:是否启用硬盘持久化缓存
timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)为0表示无限长
timeToLiveSeconds :缓存数据的 生存时间(TTL)
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。
<cache name="testCache" eternal="false"
maxElementsInMemory="1000" overflowToDisk="false" diskPersistent="false"
timeToIdleSeconds="0" timeToLiveSeconds="60"
memoryStoreEvictionPolicy="LRU"/>
3.spring配置
<bean id="cacheManagerFactory"
class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:ehcache.xml" />
</bean>
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<property name="cacheManager" ref="cacheManagerFactory" />
</bean>
<!-- 支持缓存注解 -->
<cache:annotation-driven cache-manager="cacheManager" />
4.spring注解使用
Spring对缓存的支持类似于对事务的支持。
首先使用注解标记方法,相当于定义了切点,然后使用Aop技术在这个方法的调用前、调用后获取方法的入参和返回值,进而实现了缓存的逻辑。
@Cacheable
表明所修饰的方法是可以缓存的:当第一次调用这个方法时,它的结果会被缓存下来,在缓存的有效时间内,以后访问这个方法都直接返回缓存结果,不再执行方法中的代码段。
属性
value/cacheNames:指定缓存名,可以指定多个
key:显示指定 (最终生成的key为cacheNames+key)
unless:执行后判断不缓存的条件,当结果为 true 时,不缓存
@Cacheable(value = {
"menuById"}, key = "#id", unless = "#result.type == 'folder'")
public Menu findById(String id)
{
//仅支持查询
return null;
}
@CachePut
与@Cacheable不同,@CachePut不仅会缓存方法的结果,还会执行方法的代码段。它支持的属性和用法都与@Cacheable一致。一个缓存后就不执行代码了,一个还要执行)
属性
value/cacheNames:指定缓存名,可以指定多个
key:显示指定 (最终生成的key为cacheNames+key)
unless:执行后判断不缓存的条件,当结果为 true 时,不缓存
@Cacheable(value = {
"menuById"}, key = "#id", unless = "#result.type == 'folder'")
public Menu updateMenu