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:可以缓存元素最大个数;

Eternaltrue表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false  

overflowToDisktrue,表示当缓存数据达到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

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。