這篇文章主要介紹了spring-boot整合ehcache如何實(shí)現(xiàn)緩存機(jī)制,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供且末網(wǎng)站建設(shè)、且末做網(wǎng)站、且末網(wǎng)站設(shè)計(jì)、且末網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、且末企業(yè)網(wǎng)站模板建站服務(wù),十多年且末做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
EhCache 是一個(gè)純Java的進(jìn)程內(nèi)緩存框架,具有快速、精干等特點(diǎn),是Hibernate中默認(rèn)的CacheProvider。
ehcache提供了多種緩存策略,主要分為內(nèi)存和磁盤兩級(jí),所以無需擔(dān)心容量問題。
spring-boot是一個(gè)快速的集成框架,其設(shè)計(jì)目的是用來簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開發(fā)過程。該框架使用了特定的方式來進(jìn)行配置,從而使開發(fā)人員不再需要定義樣板化的配置。
由于spring-boot無需任何樣板化的配置文件,所以spring-boot集成一些其他框架時(shí)會(huì)有略微的不同。
1.spring-boot是一個(gè)通過maven管理的jar包的框架,集成ehcache需要的依賴如下
org.springframework spring-context-support net.sf.ehcache ehcache 2.8.3
具體pom.xml文件如下
4.0.0 com.lclc.boot boot-cache 0.0.1-SNAPSHOT org.springframework.boot spring-boot-starter-parent 1.1.3.RELEASE org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-thymeleaf MySQL mysql-connector-java com.google.guava guava 17.0 org.springframework spring-context-support net.sf.ehcache ehcache 2.8.3 org.springframework.boot spring-boot-maven-plugin spring-snapshots http://repo.spring.io/snapshot true spring-milestones http://repo.spring.io/milestone spring-snapshots http://repo.spring.io/snapshot spring-milestones http://repo.spring.io/milestone
2.使用ehcache,我們需要一個(gè)ehcache.xml來定義一些cache的屬性。
解釋下這個(gè)xml文件中的標(biāo)簽。
(1).diskStore: 為緩存路徑,ehcache分為內(nèi)存和磁盤兩級(jí),此屬性定義磁盤的緩存位置。參數(shù)解釋如下:
user.home – 用戶主目錄
user.dir – 用戶當(dāng)前工作目錄
java.io.tmpdir – 默認(rèn)臨時(shí)文件路徑
(2).defaultCache:默認(rèn)緩存策略,當(dāng)ehcache找不到定義的緩存時(shí),則使用這個(gè)緩存策略。只能定義一個(gè)。
(3).cache:自定緩存策略,為自定義的緩存策略。參數(shù)解釋如下:
cache元素的屬性:
name:緩存名稱
maxElementsInMemory:內(nèi)存中最大緩存對(duì)象數(shù)
maxElementsOnDisk:硬盤中最大緩存對(duì)象數(shù),若是0表示無窮大
eternal:true表示對(duì)象永不過期,此時(shí)會(huì)忽略timeToIdleSeconds和timeToLiveSeconds屬性,默認(rèn)為false
overflowToDisk:true表示當(dāng)內(nèi)存緩存的對(duì)象數(shù)目達(dá)到了maxElementsInMemory界限后,會(huì)把溢出的對(duì)象寫到硬盤緩存中。注意:如果緩存的對(duì)象要寫入到硬盤中的話,則該對(duì)象必須實(shí)現(xiàn)了Serializable接口才行。
diskSpoolBufferSizeMB:磁盤緩存區(qū)大小,默認(rèn)為30MB。每個(gè)Cache都應(yīng)該有自己的一個(gè)緩存區(qū)。
diskPersistent:是否緩存虛擬機(jī)重啟期數(shù)據(jù)
diskExpiryThreadIntervalSeconds:磁盤失效線程運(yùn)行時(shí)間間隔,默認(rèn)為120秒
timeToIdleSeconds: 設(shè)定允許對(duì)象處于空閑狀態(tài)的最長(zhǎng)時(shí)間,以秒為單位。當(dāng)對(duì)象自從最近一次被訪問后,如果處于空閑狀態(tài)的時(shí)間超過了timeToIdleSeconds屬性值,這個(gè)對(duì)象就會(huì)過期,EHCache將把它從緩存中清空。只有當(dāng)eternal屬性為false,該屬性才有效。如果該屬性值為0,則表示對(duì)象可以無限期地處于空閑狀態(tài)
timeToLiveSeconds:設(shè)定對(duì)象允許存在于緩存中的最長(zhǎng)時(shí)間,以秒為單位。當(dāng)對(duì)象自從被存放到緩存中后,如果處于緩存中的時(shí)間超過了 timeToLiveSeconds屬性值,這個(gè)對(duì)象就會(huì)過期,EHCache將把它從緩存中清除。只有當(dāng)eternal屬性為false,該屬性才有效。如果該屬性值為0,則表示對(duì)象可以無限期地存在于緩存中。timeToLiveSeconds必須大于timeToIdleSeconds屬性,才有意義
memoryStoreEvictionPolicy:當(dāng)達(dá)到maxElementsInMemory限制時(shí),Ehcache將會(huì)根據(jù)指定的策略去清理內(nèi)存??蛇x策略有:LRU(最近最少使用,默認(rèn)策略)、FIFO(先進(jìn)先出)、LFU(最少訪問次數(shù))。
3.將ehcache的管理器暴露給spring的上下文容器,
@Configuration // 標(biāo)注啟動(dòng)了緩存 @EnableCaching public class CacheConfiguration { /* * ehcache 主要的管理器 */ @Bean(name = "appEhCacheCacheManager") public EhCacheCacheManager ehCacheCacheManager(EhCacheManagerFactoryBean bean){ return new EhCacheCacheManager (bean.getObject ()); } /* * 據(jù)shared與否的設(shè)置,Spring分別通過CacheManager.create()或new CacheManager()方式來創(chuàng)建一個(gè)ehcache基地. */ @Bean public EhCacheManagerFactoryBean ehCacheManagerFactoryBean(){ EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean (); cacheManagerFactoryBean.setConfigLocation (new ClassPathResource ("conf/ehcache-app.xml")); cacheManagerFactoryBean.setShared (true); return cacheManagerFactoryBean; } }
@Configuration:為spring-boot注解,主要標(biāo)注此為配置類,優(yōu)先掃描。
@Bean:向spring容器中加入bean。
至此所有的配置都做好了,通過spring-boot進(jìn)行集成框架就是這么簡(jiǎn)單。
4.使用ehcache
使用ehcache主要通過spring的緩存機(jī)制,上面我們將spring的緩存機(jī)制使用了ehcache進(jìn)行實(shí)現(xiàn),所以使用方面就完全使用spring緩存機(jī)制就行了。
具體牽扯到幾個(gè)注解:
@Cacheable:負(fù)責(zé)將方法的返回值加入到緩存中,參數(shù)3
@CacheEvict:負(fù)責(zé)清除緩存,參數(shù)4
參數(shù)解釋:
value:緩存位置名稱,不能為空,如果使用EHCache,就是ehcache.xml中聲明的cache的name
key:緩存的key,默認(rèn)為空,既表示使用方法的參數(shù)類型及參數(shù)值作為key,支持SpEL
condition:觸發(fā)條件,只有滿足條件的情況才會(huì)加入緩存,默認(rèn)為空,既表示全部都加入緩存,支持SpEL
allEntries:CacheEvict參數(shù),true表示清除value中的全部緩存,默認(rèn)為false
不多說,直接上代碼:
@Service public class CacheDemoServiceImpl implements CacheDemoService { /** * 緩存的key */ public static final String THING_ALL_KEY = "\"thing_all\""; /** * value屬性表示使用哪個(gè)緩存策略,緩存策略在ehcache.xml */ public static final String DEMO_CACHE_NAME = "demo"; @CacheEvict(value = DEMO_CACHE_NAME,key = THING_ALL_KEY) @Override public void create(Thing thing){ Long id = getNextId (); thing.setId (id); data.put (id, thing); } @Cacheable(value = DEMO_CACHE_NAME,key = "#thing.getId()+'thing'") @Override public Thing findById(Long id){ System.err.println ("沒有走緩存!" + id); return data.get (id); } @Cacheable(value = DEMO_CACHE_NAME,key = THING_ALL_KEY) @Override public ListfindAll(){ return Lists.newArrayList (data.values ()); } @Override @CachePut(value = DEMO_CACHE_NAME,key = "#thing.getId()+'thing'") @CacheEvict(value = DEMO_CACHE_NAME,key = THING_ALL_KEY) public Thing update(Thing thing){ System.out.println (thing); data.put (thing.getId (), thing); return thing; } @CacheEvict(value = DEMO_CACHE_NAME) @Override public void delete(Long id){ data.remove (id); } }
5.只需要通過注解在service層方法上打注解便可以使用緩存,在find**上存入緩存,在delete**,update**上清除緩存。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“spring-boot整合ehcache如何實(shí)現(xiàn)緩存機(jī)制”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!