EhCache的使用及与Spring的整合

时间:2022-01-13 05:19:43

本文主要介绍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写在类名上。