javascript
Spring 使用Cache(转)
從3.1開始Spring引入了對Cache的支持。其使用方法和原理都類似于Spring對事物管理的支持。Spring Cache是作用在方法上的,其核心思想是:當(dāng)我們在調(diào)用一個緩存方法時(shí)會把該方法參數(shù)和返回結(jié)果作為一個鍵值存放在緩存中,等到下次利用同樣的參數(shù)調(diào)用該方法時(shí)將不再執(zhí)行該方法,而是直接從緩存中獲取結(jié)果進(jìn)行返回。所以在使用Spring Cache的時(shí)候我們要保證我們的緩存的方法對于相同的方法參數(shù)要有相同的返回結(jié)果。
使用Spring Cache需要我們做兩方面的事:
l? 聲明某些方法使用緩存
l? 配置Spring對Cache的支持
和Spring對事物管理的支持一樣,Spring對Cache的支持也有基于注解和基于XML配置兩種方式。下面我們先來看看基于注解的方式。
第一章 基于注解的支持
Spring為我們提供了幾個注解來支持SpringCache。其核心主要是@Cacheable和@CacheEvict。使用@Cacheable標(biāo)記的方法在執(zhí)行后Spring Cache將緩存其返回結(jié)果,而是用@CacheEvict標(biāo)記的方法會在方法執(zhí)行前或者執(zhí)行后移除Spring Cache中的某些元素。下面詳細(xì)介紹一下Spring基于注解對Cache的支持所提供的幾個注解。
1.1 @Cacheable
@Cacheable可以標(biāo)記在一個方法上,也可以標(biāo)記在一個類上。當(dāng)標(biāo)記在一個方法上時(shí)表示該方法是支持緩存的,當(dāng)標(biāo)記在一個類上時(shí)則表示該類所有的方法都是支持緩存的。對于一個支持緩存的方法,Spring會在其被調(diào)用后將其返回值緩存起來,以保證下次利用同樣的參數(shù)來執(zhí)行該方法時(shí)可以直接從緩存中獲取結(jié)果,而不需要再次執(zhí)行該方法。Spring在緩存方法的返回值時(shí)是以鍵值對進(jìn)行緩存的,值就是方法的返回結(jié)果,至于鍵的話,Spring又支持兩種策略,默認(rèn)策略和自定義策略。需要注意的是,當(dāng)一個支持緩存的方法在對象內(nèi)部被調(diào)用時(shí)是不會觸發(fā)緩存功能的。@Cacheable可以指定三個屬性,value、key和condition。
1.1.1 value屬性指定Cache的名稱
value屬性是必須指定的,其表示當(dāng)前方法的返回值是會被緩存在哪個Cache上的,對應(yīng)Cache的名稱。其可以是一個Cache也可以是多個Cache當(dāng)需要指定多個Cache時(shí)其是一個數(shù)組。
//Cache是發(fā)生在Cache1上的
@Cacheable("Cache1")?
?? public User get(Long id) {
????? returnnull;
?? }
//Cache是發(fā)生在Cache1和Cache2上的
@Cacheable({"Cache1","Cache2"})?
?? public User get(Long id) {
????? returnnull;
?? }
?
1.1.2 使用key屬性自定義key(鍵的生成策略--自定義策略)
key屬性是用來指定Spring緩存方法的返回結(jié)果時(shí)對應(yīng)的key的。該屬性支持Spring EL表達(dá)式。當(dāng)我們沒有指定該屬性時(shí),Spring將使用默認(rèn)策略生成key(第三章的鍵生成策略講到)。我們先來看看自定義策略。
自定義策略是指我們可以通過Spring的EL表達(dá)式來指定我們的key。這里的EL表達(dá)式可以使用方法參數(shù)及他們對應(yīng)的屬性,使用方法參數(shù)時(shí)我們可以直接使用“#參數(shù)名”或者“p參數(shù)index”。下面時(shí)幾個使用參數(shù)作為key的示例。
@Cacheable(value="userCache",key="#id")
?? public User get(Long id) {
????? return null;
?? }
?
@Cacheable(value="userCache",key="#p0")
?? public User get(Long id) {
????? return null;
?? }
@Cacheable(value="userCache",key="#user.id")
?? public User get(User user) {
????? return null;
?? }
?
@Cacheable(value="userCache",key="#p0.id")
?? public User get(User user) {
????? return null;
?? }
?
除了使用方法參數(shù)作為key之外,Spring還為我們提供了一個root對象可以用來生成key。通過root對象我們可以獲取到一下信息。
| 屬性名稱 | 描述 | 示例 |
| methodName | 當(dāng)前方法名 | #root.methodName |
| method | 當(dāng)前方法 | #root.method.name |
| target | 當(dāng)前被調(diào)用的對象 | #root.target |
| targetClass | 當(dāng)前被調(diào)用的對象的class | #root.targetClass |
| args | 當(dāng)前方法參數(shù)組成的數(shù)組 | #root.args[0] |
| caches | 當(dāng)前被調(diào)用的方法使用的Cache | #root.caches[0].name |
當(dāng)我們要使用root對象的屬性作為key時(shí),我們也可以將“#root”省略,因?yàn)?/span>Spring默認(rèn)使用的就是root對象的屬性。如:
@Cacheable(value={"userCache","xxx"},key="caches[1].name")
?? public User get(User user) {
????? return null;
?? }
1.1.3 Condition屬性指定發(fā)生的條件
當(dāng)我們不希望緩存一個方法所有的返回結(jié)果時(shí),通過condition屬性可以實(shí)現(xiàn)這一功能。condition屬性默認(rèn)為空,表示將緩存所有的調(diào)用情形。其值是通過Spring EL表達(dá)式來指定的,當(dāng)為true時(shí)表示進(jìn)行緩存處理;當(dāng)為false時(shí)表示不進(jìn)行緩存處理,即每次調(diào)用該方法都會執(zhí)行一次。如下示例表示只有當(dāng)user的id為偶數(shù)時(shí)才進(jìn)行緩存。
@Cacheable(value="userCache",key="#user.id",condition="#user.id%2==0")
?? public User get(User user) {
System.out.println("select user from DB.");
????? returnuserDAO.getAll();
?? }
1.2 @CachePut
在支持Spring Cache的環(huán)境下,對于使用@Cacheable標(biāo)注的方法,Spring在每次執(zhí)行前都會檢查Cache中是否存在相同key的緩存元素,如果存在就不再執(zhí)行該方法,而是直接從緩存中獲取結(jié)果進(jìn)行返回,否則才會執(zhí)行并將返回結(jié)果存入指定的緩存中。@CachePut也可以聲明一個方法支持緩存功能。與@Cacheable不同的是使用@CachePut標(biāo)注的方法在執(zhí)行前不會去檢查緩存中是否存在之前執(zhí)行過的結(jié)果,而是每次都會執(zhí)行該方法,并將結(jié)果以鍵值對的形式存入指定的緩存中。
@CachePut也可以標(biāo)注在類上和方法上。使用@CachePut時(shí)我們可以指定的屬性跟@Cacheable是一樣的。
//每次都會執(zhí)行方法,并將返回結(jié)果存放在指定的緩存中
@CachePut("userCache")
?? public User get(Long id) {
????? return null;
?? }
1.3 @CacheEvict
@CacheEvict是用來標(biāo)注在需要清除緩存元素的方法或類上的。當(dāng)標(biāo)記在一個類上時(shí)表示其中所有的方法的執(zhí)行都會觸發(fā)緩存的清除操作。@CacheEvict可以指定的屬性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的語義與@Cacheable對應(yīng)的屬性類似。即value表示清除操作是發(fā)生在哪些Cache上的(對應(yīng)Cache的名稱);key表示需要清除的是哪個key,如未指定則會使用默認(rèn)策略生成的key;condition表示清除操作發(fā)生的條件。下面來介紹下屬性allEntries和beforeInvocation。
1.3.1 allEntries屬性(調(diào)用后清除緩存,默認(rèn)false)
allEntries是boolean類型,表示是否需要清除緩存中的所有元素。默認(rèn)為false,表示不需要。當(dāng)指定了allEntries為true時(shí),Spring Cache將忽略指定的key。有的時(shí)候我們需要Cache一下清除所有的元素,這比一個一個清除元素更為有效。
根據(jù)id清除:
@CacheEvict(value="userCache",allEntries=true)
?? public void delete(Long id) {
????? System.out.println("delete user by id:" + id);
?? }
1.3.2 beforeInvocation屬性(先清空緩存,再進(jìn)行查詢)
清除操作默認(rèn)是在對應(yīng)方法成功執(zhí)行之后觸發(fā)的,即方法如果因?yàn)楫惓6茨艹晒Ψ祷貢r(shí)也不會觸發(fā)清除操作。使用beforeInvocation可以改變觸發(fā)清除操作的時(shí)間,當(dāng)我們指定該屬性值為true時(shí),Spring會在調(diào)用該方法之前清除緩存中的元素。
根據(jù)id清除:
@CacheEvict(value="userCache",beforeInvocation=true)
?? public void delete(Long id) {
????? System.out.println("delete user by id:" + id);
?? }
其實(shí)除了使用@CacheEvict清除緩存元素外,當(dāng)我們使用Ehcache作為實(shí)現(xiàn)時(shí),我們也可以配置Ehcache自身的驅(qū)除策略,其是通過Ehcache的配置文件來指定的。
1.4 @Caching
@Caching注解可以讓我們在一個方法或者類上同時(shí)指定多個Spring Cache相關(guān)的注解。其擁有三個屬性:cacheable、put和evict,分別用于指定@Cacheable、@CachePut和@CacheEvict。
?
?
@Caching(cacheable =?@Cacheable("users"), evict = {?@CacheEvict("cache2"),
?????????@CacheEvict(value =?"cache3", allEntries =?true) })
?
?? public User get(Long id) {
????? return null;
?? }
1.5 使用自定義注解
Spring允許我們在配置可緩存的方法時(shí)使用自定義的注解,前提是自定義注解上必須使用對應(yīng)的注解進(jìn)行標(biāo)注。如,使用@Cacheable進(jìn)行標(biāo)注的自定義注解:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Cacheable(value="users")
public?@interface?MyCacheable?{
?
}
那么在我們需要緩存的放上使用@MyCacheable進(jìn)行標(biāo)注也可以達(dá)到同樣的效果。
??@MyCacheable
???public?User findById(Integer id) {
????? System.out.println("find user by id: "?+ id);
????? User user =?new?User();
????? user.setId(id);
????? user.setName("Name"?+ id);
??????return?user;
?? }
第二章 配置Spring對Cache的支持
2.1 聲明對Cache的支持
2.1.1 基于注解
配置Spring對基于注解的Cache的支持,首先我們需要在Spring的配置文件中引入cache命名空間,其次通過<cache:annotation-driven/>就可以啟用Spring對基于注解的Cache的支持。
<beans?xmlns="http://www.springframework.org/schema/beans"
???xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
???xmlns:cache="http://www.springframework.org/schema/cache"
???xsi:schemaLocation="http://www.springframework.org/schema/beans
????http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
????http://www.springframework.org/schema/cache
????http://www.springframework.org/schema/cache/spring-cache.xsd">
?
???<cache:annotation-driven/>
?
</beans>
<cache:annotation-driven/>還可以指定一個mode屬性,可選值有proxy和aspectj。默認(rèn)是使用proxy。當(dāng)mode為proxy時(shí),只有緩存方法在外部被調(diào)用的時(shí)候Spring Cache才會發(fā)生作用,這也就意味著如果一個緩存方法在其聲明對象內(nèi)部被調(diào)用時(shí)Spring Cache是不會發(fā)生作用的。而mode為aspectj時(shí)就不會有這種問題。另外使用proxy時(shí),只有public方法上的@Cacheable等標(biāo)注才會起作用,如果需要非public方法上的方法也可以使用Spring Cache時(shí)把mode設(shè)置為aspectj。
???????此外,<cache:annotation-driven/>還可以指定一個proxy-target-class屬性,表示是否要代理class,默認(rèn)為false。我們前面提到的@Cacheable、@cacheEvict等也可以標(biāo)注在接口上,這對于基于接口的代理來說是沒有什么問題的,但是需要注意的是當(dāng)我們設(shè)置proxy-target-class為true或者mode為aspectj時(shí),是直接基于class進(jìn)行操作的,定義在接口上的@Cacheable等Cache注解不會被識別到,那對應(yīng)的Spring Cache也不會起作用了。
需要注意的是<cache:annotation-driven/>只會去尋找定義在同一個ApplicationContext下的@Cacheable等緩存注解。
2.1.2 基于XML配置
除了使用注解來聲明對Cache的支持外,Spring還支持使用XML來聲明對Cache的支持。這主要是通過類似于aop:advice的cache:advice來進(jìn)行的。在cache命名空間下定義了一個cache:advice元素用來定義一個對于Cache的advice。其需要指定一個cache-manager屬性,默認(rèn)為cacheManager。cache:advice下面可以指定多個cache:caching元素,其有點(diǎn)類似于使用注解時(shí)的@Caching注解。cache:caching元素下又可以指定cache:cacheable、cache:cache-put和cache:cache-evict元素,它們類似于使用注解時(shí)的@Cacheable、@CachePut和@CacheEvict。下面來看一個示例:
<cache:advice?id="cacheAdvice"?cache-manager="cacheManager">
??????<cache:caching?cache="users">
?????????<cache:cacheable?method="findById"?key="#p0"/>
?????????<cache:cacheable?method="find"?key="#user.id"/>
?????????<cache:cache-evict?method="deleteAll"?all-entries="true"/>
??????</cache:caching>
??? </cache:advice>
上面配置定義了一個名為cacheAdvice的cache:advice,其中指定了將緩存findById方法和find方法到名為users的緩存中。這里的方法還可以使用通配符“*”,比如“find*”表示任何以“find”開始的方法。
有了cache:advice之后,我們還需要引入aop命名空間,然后通過aop:config指定定義好的cacheAdvice要應(yīng)用在哪些pointcut上。如:
<aop:config?proxy-target-class="false">
??????<aop:advisor?advice-ref="cacheAdvice"?pointcut="execution(* com.xxx.UserService.*(..))"/>
?? ?</aop:config>
?
上面的配置表示在調(diào)用com.xxx.UserService中任意公共方法時(shí)將使用cacheAdvice對應(yīng)的cache:advice來進(jìn)行Spring Cache處理。
2.2 配置CacheManager
CacheManager是Spring定義的一個用來管理Cache的接口。Spring自身已經(jīng)為我們提供了兩種CacheManager的實(shí)現(xiàn),一種是基于Java API的ConcurrentMap,另一種是基于第三方Cache實(shí)現(xiàn)——Ehcache,如果我們需要使用其它類型的緩存時(shí),我們可以自己來實(shí)現(xiàn)Spring的CacheManager接口或AbstractCacheManager抽象類。下面分別來看看Spring已經(jīng)為我們實(shí)現(xiàn)好了的兩種CacheManager的配置示例。
2.2.1 基于ConcurrentMap的配置
<bean?id="cacheManager"?class="org.springframework.cache.support.SimpleCacheManager">
??????<property?name="caches">
?????????<set>
????????????<beanclass="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"?p:name="xxx"/>
?????????</set>
??????</property>
</bean>
上面的配置使用的是一個SimpleCacheManager,其中包含一個名為“xxx”的ConcurrentMapCache。
2.2.2 基于Ehcache的配置
<!--?Ehcache實(shí)現(xiàn)?-->
???<bean?id="cacheManager"?class="org.springframework.cache.ehcache.EhCacheCacheManager"p:cache-manager-ref="ehcacheManager"/>
???<bean?id="ehcacheManager"class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"?p:config-location="ehcache-spring.xml"/>
?
或者:
<!-- 啟用Spring對基于注解的Cache的支持 -->
?? <cache:annotation-driven cache-manager ="cacheManager"/>
?? <!-- cacheManager, 指定ehcache.xml的位置 -->
?? <bean id="cacheManager"class="org.springframework.cache.ehcache.EhCacheCacheManager"p:cache-manager-ref="ehcache"/>
?? <bean id="ehcache"class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
????? <property name="configLocation"value="classpath:/ehcache.xml" />
??? </bean>
上面的配置使用了一個Spring提供的EhCacheCacheManager來生成一個Spring的CacheManager,其接收一個Ehcache的CacheManager,因?yàn)檎嬲脕泶嫒刖彺鏀?shù)據(jù)的還是Ehcache。Ehcache的CacheManager是通過Spring提供的EhCacheManagerFactoryBean來生成的,其可以通過指定ehcache的配置文件位置來生成一個Ehcache的CacheManager。若未指定則將按照Ehcache的默認(rèn)規(guī)則取classpath根路徑下的ehcache.xml文件,若該文件也不存在,則獲取Ehcache對應(yīng)jar包中的ehcache-failsafe.xml文件作為配置文件。
第三章 鍵的生成策略
鍵的生成策略有兩種,一種是默認(rèn)策略,一種是自定義策略。
3.1 默認(rèn)策略
默認(rèn)的key生成策略是通過KeyGenerator生成的,其默認(rèn)策略如下:
l? 如果方法沒有參數(shù),則使用0作為key。
l? 如果只有一個參數(shù)的話則使用該參數(shù)作為key。
l? 如果參數(shù)多余一個的話則使用所有參數(shù)的hashCode作為key。
如果我們需要指定自己的默認(rèn)策略的話,那么我們可以實(shí)現(xiàn)自己的KeyGenerator,然后指定我們的Spring Cache使用的KeyGenerator為我們自己定義的KeyGenerator。
?
1、使用基于注解的配置時(shí)是通過cache:annotation-driven指定的。
<cache:annotation-driven?key-generator="userKeyGenerator"/>
<bean?id="userKeyGenerator"?class="com.xxx.cache.UserKeyGenerator"/>
?
2、使用基于XML配置時(shí)是通過cache:advice來指定的。
<cache:advice?id="cacheAdvice"?cache-manager="cacheManager"?key-generator="userKeyGenerator">
</cache:advice>
需要注意的是此時(shí)我們所有的Cache使用的Key的默認(rèn)生成策略都是同一個KeyGenerator。
3.2 自定義策略
(第一章中已介紹)
第四章 Spring單獨(dú)使用Ehcache
前面介紹的內(nèi)容是Spring內(nèi)置的對Cache的支持,其實(shí)我們也可以通過Spring自己單獨(dú)的使用Ehcache的CacheManager或Ehcache對象。通過在Application Context中配置EhCacheManagerFactoryBean和EhCacheFactoryBean,我們就可以把對應(yīng)的EhCache的CacheManager和Ehcache對象注入到其它的Spring bean對象中進(jìn)行使用。
4.1 EhCacheManagerFactoryBean
EhCacheManagerFactoryBean是Spring內(nèi)置的一個可以產(chǎn)生Ehcache的CacheManager對象的FactoryBean。其可以通過屬性configLocation指定用于創(chuàng)建CacheManager的Ehcache配置文件的路徑,通常是ehcache.xml文件的路徑。如果沒有指定configLocation,則將使用默認(rèn)位置的配置文件創(chuàng)建CacheManager,這是屬于Ehcache自身的邏輯,即如果在classpath根路徑下存在ehcache.xml文件,則直接使用該文件作為Ehcache的配置文件,否則將使用ehcache-xxx.jar中的ehcache-failsafe.xml文件作為配置文件來創(chuàng)建Ehcache的CacheManager。此外,如果不希望創(chuàng)建的CacheManager使用默認(rèn)的名稱(在ehcache.xml文件中定義的,或者是由CacheManager內(nèi)部定義的),則可以通過cacheManagerName屬性進(jìn)行指定。下面是一個配置EhCacheManagerFactoryBean的示例。
<!--?定義CacheManager -->
???<bean?id="cacheManager"class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
??????<!--?指定配置文件的位置?-->
??????<property?name="configLocation"?value="/WEB-INF/config/ehcache.xml"/>
??????<!--?指定新建的CacheManager的名稱?-->
??????<property?name="cacheManagerName"?value="cacheManagerName"/>
???</bean>
4.2 EhCacheFactoryBean
??EhCacheFactoryBean是用來產(chǎn)生Ehcache的Ehcache對象的FactoryBean。定義EhcacheFactoryBean時(shí)有兩個很重要的屬性我們可以來指定。一個是cacheManager屬性,其可以指定將用來獲取或創(chuàng)建Ehcache的CacheManager對象,若未指定則將通過CacheManager.create()獲取或創(chuàng)建默認(rèn)的CacheManager。另一個重要屬性是cacheName,其表示當(dāng)前EhCacheFactoryBean對應(yīng)的是CacheManager中的哪一個Ehcache對象,若未指定默認(rèn)使用beanName作為cacheName。若CacheManager中不存在對應(yīng)cacheName的Ehcache對象,則將使用CacheManager創(chuàng)建一個名為cacheName的Cache對象。此外我們還可以通過EhCacheFactoryBean的timeToIdle、timeToLive等屬性指定要創(chuàng)建的Cache的對應(yīng)屬性,注意這些屬性只對CacheManager中不存在對應(yīng)Cache時(shí)新建的Cache才起作用,對已經(jīng)存在的Cache將不起作用,更多屬性設(shè)置請參考Spring的API文檔。此外還有幾個屬性是對不管是已經(jīng)存在還是新創(chuàng)建的Cache都起作用的屬性:statisticsEnabled、sampledStatisticsEnabled、disabled、blocking和cacheEventListeners,其中前四個默認(rèn)都是false,最后一個表示為當(dāng)前Cache指定CacheEventListener。下面是一個定義EhCacheFactoryBean的示例。
?
?
???<!--?定義CacheManager-->
???<bean?id="cacheManager"class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
??????<!--?指定配置文件的位置?-->
??????<property?name="configLocation"?value="/WEB-INF/config/ehcache.xml"/>
??????<!--?指定新建的CacheManager的名稱?-->
??????<property?name="cacheManagerName"?value="cacheManagerName"/>
???</bean>
??
???<!--?定義一個Ehcache?-->
???<bean?id="userCache"?class="org.springframework.cache.ehcache.EhCacheFactoryBean">
??????<property?name="cacheName"?value="user"/>
??????<property?name="cacheManager"?ref="cacheManager"/>
???</bean>
?
第五章 ehcache配置
5.1 Cache配置
?
<?xml version="1.0"encoding="UTF-8"?>
?
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
???????? xsi:noNamespaceSchemaLocation="ehcache.xsd"
???????? updateCheck="true"monitoring="autodetect"
???????? dynamicConfig="true">
?
??? <diskStore path="java.io.tmpdir"/>
?
??? <transactionManagerLookup class="net.sf.ehcache.transaction.manager.DefaultTransactionManagerLookup"
????????????????????????????? properties="jndiName=java:/TransactionManager" propertySeparator=";"/>
?
??? <cacheManagerEventListenerFactory class=""properties=""/>
?
??? <cacheManagerPeerProviderFactory
??????????? class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
??????????? properties="peerDiscovery=automatic,
???????????????????????multicastGroupAddress=230.0.0.1,
???????????????????????multicastGroupPort=4446, timeToLive=1"
??????????? propertySeparator=","
??????????? />
?
??? <cacheManagerPeerListenerFactory
??????????? class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"/>
?
??? <defaultCache
??????????? eternal="false"
??????????? maxEntriesLocalHeap="10000"
??????????? maxEntriesLocalDisk="1000"
??????????? maxElementsOnDisk="10000000"
??????????? maxElementsInMemory="3000"
??????????? timeToIdleSeconds="120"
??????????? timeToLiveSeconds="120"
??????????? diskSpoolBufferSizeMB="30"
??????????? diskExpiryThreadIntervalSeconds="120"
??????????? memoryStoreEvictionPolicy="LRU">
??????? <persistence strategy="localTempSwap"/>
??? </defaultCache>
?
??? <cache name="userCache"
?????????? eternal="false"
?????????? maxEntriesLocalHeap="10000"
?????????? maxEntriesLocalDisk="1000"
?????????? maxElementsOnDisk="10000000"
?????????? maxElementsInMemory="3000"
?????????? diskSpoolBufferSizeMB="30"
?????????? timeToIdleSeconds="300"
?????????? timeToLiveSeconds="600"
?????????? memoryStoreEvictionPolicy="LFU"
?????????? diskExpiryThreadIntervalSeconds="120"
?????????? transactionalMode="off">
??????? <persistence strategy="localTempSwap"/>
</cache>
</ehcache>
?
?
l? name:Cache的唯一標(biāo)識名稱.
l? maxEntriesLocalHeap:堆內(nèi)存中最大緩存對象數(shù),0沒有限制
l? maxElementsInMemory:緩存最大個數(shù)。
l? eternal:對象是否永久有效,一但設(shè)置了,timeout將不起作用。
l? timeToIdleSeconds:設(shè)置對象在失效前的允許閑置時(shí)間(單位:秒)。僅當(dāng)eternal=false對象不是永久有效時(shí)使用,可選屬性,默認(rèn)值是0,也就是可閑置時(shí)間無窮大。
l? timeToLiveSeconds:設(shè)置對象在失效前允許存活時(shí)間(單位:秒)。最大時(shí)間介于創(chuàng)建時(shí)間和失效時(shí)間之間。僅當(dāng)eternal=false對象不是永久有效時(shí)使用,默認(rèn)是0.,也就是對象存活時(shí)間無窮大。?
l? overflowToDisk:當(dāng)內(nèi)存中對象數(shù)量達(dá)到maxElementsInMemory時(shí),Ehcache將會對象寫到磁盤中。??
l? diskSpoolBufferSizeMB:這個參數(shù)設(shè)置DiskStore(磁盤緩存)的緩存區(qū)大小。默認(rèn)是30MB。每個Cache都應(yīng)該有自己的一個緩沖區(qū)。
l? maxElementsOnDisk:硬盤最大緩存?zhèn)€數(shù)。?
l? diskPersistent:是否緩存虛擬機(jī)重啟期數(shù)據(jù)?Whether?the?disk?store?persists?between?restarts?of?the?Virtual?Machine.?The?default?value?is?false.??
l? diskExpiryThreadIntervalSeconds:磁盤失效線程運(yùn)行時(shí)間間隔,默認(rèn)是120秒。??
l? memoryStoreEvictionPolicy:當(dāng)達(dá)到maxElementsInMemory限制時(shí),Ehcache將會根據(jù)指定的策略去清理內(nèi)存。默認(rèn)策略是LRU(最近最少使用)。你可以設(shè)置為FIFO(先進(jìn)先出)或是LFU(較少使用)。??
l? clearOnFlush:內(nèi)存數(shù)量最大時(shí)是否清除。
總結(jié)
以上是生活随笔為你收集整理的Spring 使用Cache(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php性能优化 --- laravel
- 下一篇: JS的eval函数解密反混淆