Spring框架學(xué)習(xí)之Cache抽象詳解
Spring為不同緩存做了一層抽象,這里通過(guò)閱讀文檔以及源碼會(huì)對(duì)使用以及原理做一些學(xué)習(xí)筆記。
1.簡(jiǎn)介
從3.1版開(kāi)始,Spring Framework提供了對(duì)現(xiàn)有Spring應(yīng)用程序透明地添加緩存的支持。 與事務(wù)支持類(lèi)似,緩存抽象允許一致地使用各種緩存解決方案,而對(duì)代碼的影響最小。
從Spring 4.1開(kāi)始,通過(guò)JSR-107注釋和更多自定義選項(xiàng)的支持,緩存抽象得到了顯著改進(jìn)。
cache和buffer
從術(shù)語(yǔ)上看,"buffer"和"cache",可以互相被替換.但是,他們確實(shí)代表著不同的事情.
傳統(tǒng)上,一個(gè)buffer被用來(lái)作為快數(shù)據(jù)和慢數(shù)據(jù)之間的臨時(shí)存儲(chǔ).因?yàn)榭焖俚囊环叫枰却囊环?會(huì)影響性能),buffer通過(guò)允許整塊數(shù)據(jù)一次移動(dòng)而不是一小塊數(shù)據(jù)一點(diǎn)一點(diǎn)移動(dòng)來(lái)緩解壓力. 這個(gè)數(shù)據(jù)只會(huì)從buffer中被寫(xiě)入或者讀出一次.此外,buffers對(duì)總對(duì)一方可以見(jiàn).
Cache,則相反,通過(guò)定義,隱藏,并且不會(huì)讓對(duì)方意識(shí)到它的存在.它同樣提高性能,但是這是讓相同數(shù)據(jù)在同時(shí)以快速的方式被多次讀取來(lái)實(shí)現(xiàn)的.
2.緩存抽象
緩存抽象的核心是將緩存應(yīng)用于Java方法,從而減少了基于緩存中可用信息的執(zhí)行次數(shù)。也就是說(shuō),每次調(diào)用目標(biāo)方法時(shí),抽象都會(huì)應(yīng)用緩存行為檢查方法是否已經(jīng)為給定的參數(shù)執(zhí)行。如果有,則返回緩存的結(jié)果,而不必執(zhí)行實(shí)際的方法;如果沒(méi)有,則執(zhí)行方法,緩存結(jié)果并返回給用戶(hù),以便在下次調(diào)用方法時(shí)返回緩存的結(jié)果。這樣,對(duì)于給定的一組參數(shù),昂貴的方法(CPU或IO綁定)只能執(zhí)行一次,并且結(jié)果可以重用,而不必實(shí)際再次執(zhí)行該方法。緩存邏輯被透明地應(yīng)用,沒(méi)有任何對(duì)調(diào)用程序的干擾。
緩存抽象提供了其他緩存相關(guān)的操作,比如更新緩存的內(nèi)容或者刪除一個(gè)或者全部.如果緩存在處理數(shù)據(jù)的過(guò)程中經(jīng)常改變,這些操作將非常有用.
就像Spring Framework中的其他服務(wù)一樣,緩存服務(wù)是一種抽象(不是緩存實(shí)現(xiàn)),需要使用實(shí)際存儲(chǔ)來(lái)存儲(chǔ)緩存數(shù)據(jù) - 也就是說(shuō),抽象使開(kāi)發(fā)人員不必編寫(xiě)緩存相關(guān)邏輯,但它也不提供實(shí)際的數(shù)據(jù)存儲(chǔ)能力。
通過(guò)接口 org.springframework.cache.Cache(緩存)
和org.springframework.cache.CacheManager(緩存管理器) 實(shí)現(xiàn)緩存的抽象
這個(gè)抽象的一些實(shí)現(xiàn)可以直接使用:基于JDK java.util.concurrent.ConcurrentMap的緩存(即默認(rèn)的緩存是基于JVM的ConcurrentMap),Ehcache 2.x,Gemfire緩存,Caffeine,符合和JSR-107的緩存(例如Ehcache 3.x)。 有關(guān)插入其他緩存存儲(chǔ)/提供程序的更多信息,請(qǐng)參閱插入不同的后端緩存。
3.spring緩存抽象與多進(jìn)程
注意的是:
Spring的緩存抽象沒(méi)有特別處理多線(xiàn)程或者多進(jìn)程,這些都是緩存的實(shí)現(xiàn)來(lái)處理的。
如果你有多進(jìn)程環(huán)境(一個(gè)應(yīng)用部署在多個(gè)節(jié)點(diǎn)上),你需要配置相應(yīng)地提供你緩存的程序.根據(jù)你的用例,從多個(gè)節(jié)點(diǎn)上拷貝相通數(shù)據(jù)就足夠了.然而,如果在應(yīng)用的過(guò)程中修改了數(shù)據(jù),則需要有其他的機(jī)制來(lái)通知修改.
緩存一個(gè)專(zhuān)門(mén)的對(duì)象是一個(gè)與典型的get-if-not-found-then- proceed-and-put-eventually代碼塊等價(jià),是通過(guò)編程緩存交互找到.沒(méi)有鎖被使用,多個(gè)線(xiàn)程并發(fā)的獲取相同的數(shù)據(jù).刪除(eviction)也同樣如此.如果多個(gè)線(xiàn)程嘗試并發(fā)的更新或者刪除數(shù)據(jù),你也許就使用了過(guò)時(shí)(stale)的數(shù)據(jù).一些緩存提供方提供了更加高級(jí)的特性.從文檔中可以看到更多的細(xì)節(jié).
使用緩存你需要從兩方面看起:
- 聲明緩存:確認(rèn)需要被緩存的方法還有他們使用的策略
- 配置緩存: 存儲(chǔ)數(shù)據(jù)然后把數(shù)據(jù)讀到緩存中.
以上就是Spring框架學(xué)習(xí)之Cache抽象詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring框架Cache抽象的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java實(shí)戰(zhàn)之酒店人事管理系統(tǒng)的實(shí)現(xiàn)
這篇文章主要介紹了如何用Java實(shí)現(xiàn)酒店人事管理系統(tǒng),文中采用的技術(shù)有:JSP、Spring、SpringMVC、MyBatis等,感興趣的小伙伴可以學(xué)習(xí)一下2022-03-03java實(shí)現(xiàn)從方法返回多個(gè)值功能示例
這篇文章主要介紹了java實(shí)現(xiàn)從方法返回多個(gè)值功能,結(jié)合實(shí)例形式分析了集合類(lèi)、封裝對(duì)象、引用傳遞三種實(shí)現(xiàn)方法,需要的朋友可以參考下2017-10-10