Spring整合Ehcache

Spring可以直接使用注解来缓存数据,这个非常不错的功能,但是今天遇到了一个小问题,记录一下。

下面两段代码:

@Cacheable("article")
public List<Article> findArticleNew()...
 
@Cacheable("article")
public List<Article> findArticleHot()...

这两个就会出现问题,本来是两个完全不同的逻辑但是查询出来的数据是一样的,那么为什么呢,原来如果你默认不配置key的时候,Spring是根据参数来决定缓存的key的。这两个都没有参数,所以key是一样的,就会得到同样的值了。

解决问题:

@Cacheable(value = "article", key = "'article_new'")
public List<Article> findArticleNew()...
 
@Cacheable(value = "article", key = "'article_hot'")
public List<Article> findArticleHot()...

加上key就可以了, 注意key的使用SpEL表达式

参考文章:http://sishuok.com/forum/blogPost/list/2463.html

Spring整合Ehcache有两种方法,Ehcache的配置我就不写了。

第一种配置:

xmlns:cache="http://www.springframework.org/schema/cache"
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.2.xsd
 
<cache:annotation-driven cache-manager="cacheManager" />
 
<bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="configLocation" value="classpath:/ehcache.xml" />
    <property name="shared" value="true" />
</bean>
 
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
    <property name="cacheManager" ref="ehCacheManager" />
</bean>

使用:

@org.springframework.cache.annotation.Cacheable(value = "key")
@org.springframework.cache.annotation.CacheEvict(value = "key")

在方法上面注解,但是注意的是,默认的缓存键值key为参数,如果该方法没有参数时,请注意使用。

第二种配置:

xmlns:ehcache="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"
http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring classpath:/com/googlecode/ehcache/annotations/ehcache-spring-1.1.xsd
 
<ehcache:annotation-driven />
 
<ehcache:config cache-manager="cacheManager">
    <ehcache:evict-expired-elements interval="60" />
</ehcache:config>
 
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="configLocation" value="classpath:/ehcache.xml" />
</bean>

使用:

@com.googlecode.ehcache.annotations.Cacheable(cacheName = "key")
@com.googlecode.ehcache.annotations.TriggersRemove(cacheName = "key")

缓存的key和上面一样都是使用参数的,无参方法请注意。

同一个类里面的方法调用,不能使用注解,否者缓存无效,如果需要使用缓存,可以使用CacheManager来做。