Ehcache——基于注解的缓存使用
ehcache是一个非常轻量级的缓存实现,而且从1.2之后就支持了集群,而且是hibernate默认的缓存provider。EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。
Ehcache的分布式缓存有传统的RMI,1.5版的JGroups,1.6版的JMS。分布式缓存主要解决集群环境中不同的服务器间的数据的同步问题。
使用Spring的AOP进行整合,可以灵活的对方法的返回结果对象进行缓存。
CachingFilter功能可以对HTTP响应的内容进行缓存。
1、主要特性
1) 快速.
2) 简单.
3) 多种缓存策略
4) 缓存数据有两级:内存和磁盘,因此无需担心容量问题
5) 缓存数据会在虚拟机重启的过程中写入磁盘
6) 可以通过RMI、可插入API等方式进行分布式缓存
7) 具有缓存和缓存管理器的侦听接口
8) 支持多缓存管理器实例,以及一个实例的多个缓存区域
9) 提供Hibernate的缓存实现
10) 等等
2、 使用ehcache时,需要在spring的配置中添加如下配置:
<?xml version="1.0" encoding="UTF-8"?>
<!--1)cache的命名空间;--> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:cache="http://www.springframework.org/schema/cache" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">
<!--2)启用缓存注解功能,否则就无法通过注解进行缓存;-->
<cache:annotation-driven cache-manager="cacheManager"/>
<!--3)下面的配置使用了一个Spring提供的EhCacheCacheManager来生成一个Spring的CacheManager,其接收一个Ehcache的CacheManager,因为真正用来存入缓存数 据的还是Ehcache。Ehcache的CacheManager是通过Spring提供的EhCacheManagerFactoryBean来生成的,可以通过指定ehcache的配置文件位置来生成一个Ehcache的Ca cheManager。若未指定则将按照Ehcache的默认规则取classpath根路径下的ehcache.xml文件;若该文件也不存在,则获取Ehcache对应jar包中的ehcache-failsafe.xm l文件作为配置文件。-->
<bean id="ehCacheManagerFactory" 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="ehCacheManagerFactory"/> <!-- 表示是否事务环绕的,如果true,则如果事务回滚,缓存也回滚,默认false --> <property name="transactionAware" value="true"/> </bean> </beans>
上面的配置使用了一个Spring提供的EhCacheCacheManager来生成一个Spring的CacheManager,其接收一个Ehcache的CacheManager,因为真正用来存入缓存数据的还是Ehcache。Ehcache的CacheManager是通过Spring提供的EhCacheManagerFactoryBean来生成的,其可以通过指定ehcache的配置文件位置来生成一个Ehcache的CacheManager。若未指定则将按照Ehcache的默认规则取classpath根路径下的ehcache.xml文件,若该文件也不存在,则获取Ehcache对应jar包中的ehcache-failsafe.xml文件作为配置文件。更多关于Ehcache的内容这里就不多说了,它不属于本文讨论的内容,欲了解更多关于Ehcache的内容可以参考我之前发布的Ehcache系列文章,也可以参考官方文档等。
3、ehcache.xml配置格式说明:
diskStore:
指定一个文件目录,当EHCache把数据写到硬盘上时,将把数据写到这个文件目录下;
取值有:
user.home – 用户主目录
user.dir – 用户当前工作目录
java.io.tmpdir – 默认临时文件路径
defaultCache:
设定缓存的默认数据过期策略
Cache:
设定具体的命名缓存的数据过期策略;
Cache中包含的属性主要有:
maxElementsInMemory:可以缓存元素最大个数;
Eternal:true表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false
overflowToDisk:true,表示当缓存数据达到maxElementsInMemory时,会把溢出的对象缓存到磁盘中;false,会根据过期策略进行淘汰;
timeToIdleSeconds:对象空闲的最长时间,以秒为单位,达到这个这时间时对象会过期;
timeToLiveSeconds:设定对象允许存在于缓存中的最长时间,以秒为单位;
diskPersistent:否在磁盘上持久化。指重启jvm后,数据是否有效。
<?xml version="1.0" encoding="UTF-8"?> <ehcache> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" eternal="false" overflowToDisk="false" timeToIdleSeconds="1800" timeToLiveSeconds="1800" diskPersistent="false"/> <cache name="bdRules" maxElementsInMemory="200" eternal="false" overflowToDisk="false" timeToIdleSeconds="60" timeToLiveSeconds="60" memoryStoreEvictionPolicy="LFU" /> <cache name="bdRulesCount" maxElementsInMemory="200" eternal="false" overflowToDisk="false" timeToIdleSeconds="60" timeToLiveSeconds="60" memoryStoreEvictionPolicy="LFU" /> <cache name="bdmRules" maxElementsInMemory="20" eternal="false" overflowToDisk="false" timeToIdleSeconds="60" timeToLiveSeconds="60" memoryStoreEvictionPolicy="LFU" /> </ehcache>
4、注解介绍:
1)Cacheable:添加缓存;如果已经缓存,则不执行方法,直接返回缓存结果
value:缓存名称,不为空,与ehcache.xml中声明的cache的name一致
key:缓存的key,默认为空,使用方法的参数类型及参数值作为key,支持SpEL
condition:触发条件,当条件满足时会将方法的返回值缓存,默认为空,既表示全部都加入缓存,支持SpEL
@Cacheable(value = "bdmRules", key = "#p0") SaleCommissionRuleBdmEntity queryBdmRuleByMonth(@Param("timeInterval") String timeInterval, @Param("department") String department);
2)CacheEvict:执行方法,并且清除缓存
value:缓存位置名称,不能为空
key:缓存的key,默认为空,同上
condition:触发条件,只有满足条件的情况才会清除缓存,默认为空,支持SpEL
allEntries:true表示清除value中的全部缓存,默认为false
3)CachePut:既要保证方法被执行,又缓存结果
参数同Cacheable
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。