EhCache的使用及与Spring的整合

本文主要介绍EhCache的使用,以及EhCache与Spring的整合的实践经验。

EHCache API的基本用法

首先介绍CacheManager类。它主要负责读取配置文件,默认读取CLASSPATH下的ehcache.xml,根据配置文件创建并管理Cache对象。

  // 使用默认配置文件创建CacheManager
  CacheManager manager = CacheManager.create();
  // 获取指定名称的Cache对象
  Cache cache = manager.getCache("demoCache");
  // 使用manager移除指定名称的Cache对象
  manager.removeCache("demoCache");

有了Cache对象之后就可以进行一些基本的Cache操作,例如:

  //往cache中添加元素
  Element element = new Element("key", "value");
  //可以设置该元素的缓存时间,单位秒
  element.setTimeToLive(60);
  cache.put(element);
  //从cache中取回元素
  Element element = cache.get("key");
  element.getObjectValue();
  //从Cache中移除一个元素
  cache.remove("key");

可以直接使用上面的API进行数据对象的缓存,这里需要注意的是对于缓存的对象都是必须可序列化的。 

可以通过调用manager.removalAll()来移除所有的Cache。通过调用manager的shutdown()方法可以关闭CacheManager。

配置文件

    配置文件ehcache.xml中命名为demoCache的缓存配置:
    <cache name="demoCache" 
        maxElementsInMemory="10000" 
        eternal="false"
        overflowToDisk="true" 
        timeToIdleSeconds="300" 
        timeToLiveSeconds="600"
        memoryStoreEvictionPolicy="LFU" />
   
各配置参数的含义:
maxElementsInMemory:缓存中允许创建的最大对象数。
eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。
    timeToIdleSeconds:缓存数据的钝化时间,也就是在一个元素消亡之前,两次访问时间的最大时间间隔值, 这只能在元素不是永久驻留时有效,如果该值是 0 就意味着元素可以停顿无穷长的时间。
    timeToLiveSeconds:缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值,这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。
overflowToDisk:内存不足时,是否启用磁盘缓存。
    memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。LRU和FIFO算法这里就不做介绍。LFU算法直接淘汰使用比较少的对象,在内存保留的都是一些经常访问的对象。对于大部分网站项目,该算法比较适用。
如果应用需要配置多个不同命名并采用不同参数的Cache,可以相应修改配置文件,增加需要的Cache配置即可。

EhCache整合Spring

首先,在CLASSPATH下面放置ehcache.xml配置文件。在Spring的配置文件中添加如下cacheManager配置:

     <bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
          <property name="configLocation" ref="classpath:ehcache.xml" />
     </bean>
     <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
          <property name="cacheManager" ref="cacheManagerFactory" />
     </bean>

若启用缓存注解功能,须添加如下配置,否则注解不会生效,另外,该配置一定要声明在spring主配置文件中才会生效。

<beans xmlns:cache="http://www.springframework.org/schema/cache" 
  xsi:schemaLocation="http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.2.xsd">
        <cache:annotation-driven cache-manager="ehcacheManager"/>
</beans>


使用注解实现缓存:
@Cacheable 一般应用到查询方法上,先从缓存中读取数据,若缓存中没有,再调用该方法获取数据,然后将数据结果放入缓存中。

例如:

@Cacheable(value = "demoCache",key="#isbn.id",condition = "#isbn.id<10")

public Manual findManual(ISBN isbn, boolean checkWarehouse)


value 的值为ehcache.xml里的缓存名字,必须制定,至少一个。或者@Cacheable(value={”cache1”,”cache2”})。 key 的值为缓存的key,需要保证唯一,用的是Spring 的SpEL表达式,以上例子key值为 isbn对象的id属性值,如果不指定,则缺省按照方法的所有参数进行组合。condition为缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存。 唯一key值可以这样设置 key="'mytest_'+#isbn.id"


@CacheEvict 一般应用到删除方法上,调用方法时会从缓存中移除相应的数据。

allEntries为是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存。

例如:

@CachEvict(value=”demoCache”,allEntries=true)。

beforeInvocation 为是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存。

例如:

@CachEvict(value=”testcache”,beforeInvocation=true)。

@CachePut 一般应用到新增/修改方法上,每次都会执行方法,并且把执行结果放入缓存。

主要参数有value,key,condition。


所有的@Cacheable()里面都有一个name=“xxx”的属性,显然累赘了,这里可以一次性声明,用@CacheConfig这个配置,@CacheConfig  is a class-level annotation that allows to share the cache names,但如果在方法上写别的名字,那么依然以方法的名字为准。@CacheConfig写在类名上。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值