1 :添加依賴:
//緩存:
? ?<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>? ?spring-boot-starter-cache?</artifactId>
</dependency>
? <dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>? ?ehcache</artifactId>
? <version>2.9.0</version>
</dependency>
2 配置 ehCache.xml(一般放在resource根目錄下):
? ? <?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
? ? ? ? xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
? ? ? ? updateCheck="false">
<!--這是默認(rèn)的Cache,沒(méi)有對(duì)應(yīng)的字段啟動(dòng)默認(rèn)的-->
<defaultCache
? ? ? ? eternal="false"
? ? ? ? maxElementsInMemory="1000"
? ? ? ? overflowToDisk="false"
? ? ? ? diskPersistent="false"
? ? ? ? timeToIdleSeconds="0"
? ? ? ? timeToLiveSeconds="600"
? ? ? ? memoryStoreEvictionPolicy="LRU"/>
<!--這里的 users 緩存空間是為了下面的 demo 做準(zhǔn)備-->? ?
?<cache? ? name="userinfo"
? ? ? ? eternal="false"
? ? ? ? maxElementsInMemory="100"
? ? ? ? overflowToDisk="false"
? ? ? ? diskPersistent="false"
? ? ? ? timeToIdleSeconds="0"
? ? ? ? timeToLiveSeconds="3000"
? ? ? ? memoryStoreEvictionPolicy="LRU" />
</ehcache>
下面是對(duì)ehcache的屬性進(jìn)行解讀:
diskStore:為緩存路徑缚忧,
ehcache分為內(nèi)存和磁盤兩級(jí)悟泵,此屬性定義磁盤的緩存位置。
defaultCache:默認(rèn)緩存策略闪水,當(dāng)ehcache找不到定義的緩存時(shí)糕非,則使用這個(gè)緩存策略。只能定義一個(gè)。name:緩存名稱朽肥。maxElementsInMemory:緩存最大數(shù)目
maxElementsOnDisk:硬盤最大緩存?zhèn)€數(shù)禁筏。
eternal:對(duì)象是否永久有效,一但設(shè)置了衡招,timeout將不起作用篱昔。
overflowToDisk:是否保存到磁盤,
當(dāng)系統(tǒng)當(dāng)機(jī)時(shí)timeToIdleSeconds:設(shè)置對(duì)象在失效前的允許閑置時(shí)間(單位:秒)始腾。僅當(dāng)eternal=false對(duì)象不是永久有效時(shí)使用旱爆,可選屬性,默認(rèn)值是0窘茁,也就是可閑置時(shí)間無(wú)窮大怀伦。
timeToLiveSeconds:設(shè)置對(duì)象在失效前允許存活時(shí)間(單位:秒)。最大時(shí)間介于創(chuàng)建時(shí)間和失效時(shí)間之間山林。僅當(dāng)eternal=false對(duì)象不是永久有效時(shí)使用房待,默認(rèn)是0.,也就是對(duì)象存活時(shí)間無(wú)窮大驼抹。
diskPersistent:是否緩存虛擬機(jī)重啟期數(shù)據(jù)Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
diskSpoolBufferSizeMB:這個(gè)參數(shù)設(shè)置DiskStore(磁盤緩存)的緩存區(qū)大小桑孩。默認(rèn)是30MB。每個(gè)Cache都應(yīng)該有自己的一個(gè)緩沖區(qū)框冀。diskExpiryThreadIntervalSeconds:磁盤失效線程運(yùn)行時(shí)間間隔流椒,默認(rèn)是120秒。
memoryStoreEvictionPolicy:當(dāng)達(dá)到maxElementsInMemory限制時(shí)明也,Ehcache將會(huì)根據(jù)指定的策略去清理內(nèi)存宣虾。
默認(rèn)策略是LRU(最近最少使用)。你可以設(shè)置為FIFO(先進(jìn)先出)或是LFU(較少使用)温数。?
clearOnFlush:內(nèi)存數(shù)量最大時(shí)是否清除绣硝。? memoryStoreEvictionPolicy:可選策略有:
????LRU(最近最少使用,默認(rèn)策略)撑刺、
????FIFO(先進(jìn)先出)鹉胖、
????LFU(最少訪問(wèn)次數(shù))。? ??
? ?FIFO够傍,first in first out甫菠,這個(gè)是大家最熟的,先進(jìn)先出冕屯。?
?? LFU寂诱, Less Frequently Used,一直以來(lái)最少被使用的愕撰。如上面所講刹衫,緩存的元素有一個(gè)hit屬性,hit值最小的將會(huì)被清出緩存搞挣。? ??
? ?LRU带迟,Least Recently Used,最近最少使用的囱桨,緩存的元素有一個(gè)時(shí)間戳仓犬,當(dāng)緩存容量滿了,而又需要騰出地方來(lái)緩存新的元素的時(shí)候舍肠,那么現(xiàn)有緩存元素中時(shí)間戳離當(dāng)前時(shí)間最遠(yuǎn)的元素將被清出緩存搀继。
3 啟動(dòng) 緩存
@Configuration
@EnableCaching
public class CacheConfig {
????@Bean
????public EhCacheCacheManagercacheCacheManager(net.sf.ehcache.CacheManager ehCacheManager){
????return? new EhCacheCacheManager(ehCacheManager);
}
????@Bean
????public EhCacheManagerFactoryBeanehCacheCacheManagerFactoryBean(){
????????//注入ehCacheMangerFactorybean
? ????? EhCacheManagerFactoryBean ehCacheManagerFactoryBean =new EhCacheManagerFactoryBean();
? ? ????ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehCache"));//設(shè)置eh.xml配置文件的地址一般放在resoures根目錄下
? ????? return ehCacheManagerFactoryBean;
????}
}
也可以去配置:application.properties;同時(shí)啟動(dòng)類添加@EnableCaching注釋
#配置cache
spring.cache.cache-names=userinfo
spring.cache.type=ehcache
#spring.cache.ehcache.config=/ehCache.xml
spring.cache.ehcache.config=classpath:/ehCache.xml
#spring.cache.type=#緩存的技術(shù)類型
#spring.cache.cache-names=應(yīng)用程序啟動(dòng)創(chuàng)建緩存的名稱
#spring.cache.ehcache.config=ehcache的配置文件位置
4:可以將一下注解放到方法或者類上
????@cacheable(找到則不調(diào)用方法)翠语;
????@Cacheput(都會(huì)調(diào)用方法叽躯,然后把值放到緩存去);
????@CacheEvit(移除緩存肌括,要放在conrtoller或者dao才起作) 点骑;
????@Caching(分組注解,能夠同時(shí)應(yīng)用到其他的緩存注解)?
????特別說(shuō)明:沒(méi)指定key谍夭,則方法的參數(shù)作為key保存到緩存中
????注:@cacheable和@cacheput都是有返回值的才能使用黑滴,@cacheEivt則可以在void上使用
????屬性含義:? value :要是用緩存的名稱;key值數(shù)據(jù)在緩存中的存儲(chǔ)的鍵
????Value 緩存名稱紧索;codition 為false不會(huì)放到緩存袁辈;key緩存的標(biāo)識(shí);unless 為true則不會(huì)放到緩存(有返回值才起作用珠漂;@cacheEvit沒(méi)有)晚缩。
????@cacheEvic特有的:allEntries 刪除所有的;beforeInvocation 默認(rèn)false 媳危;true則再方法調(diào)用前移除條目橡羞。
????緩存中使用到的key 的 SpEL的表達(dá)式:
???????? #result :返回值 (@cacheable不能用)
???????? #Argument任意方法的參數(shù)名或者參數(shù)索引。
???????? #root .args傳遞給緩存方法的參數(shù)济舆,形式為數(shù)組