Spring Boot集成cache

緩存簡(jiǎn)介

工作機(jī)制是:先從緩存中讀取數(shù)據(jù)去枷,如果沒有再從慢速設(shè)備上讀取實(shí)際數(shù)據(jù)(數(shù)據(jù)也會(huì)存入緩存);緩存什么:那些經(jīng)常讀取且不經(jīng)常修改的數(shù)據(jù)/那些昂貴(CPU/IO)的且對(duì)于相同的請(qǐng)求有相同的計(jì)算結(jié)果的數(shù)據(jù)。例如Maven/京東物流都是這種思想

緩存命中率

即從緩存中讀取數(shù)據(jù)的次數(shù) 與 總讀取次數(shù)的比率椎侠,命中率越高越好:

命中率 = 從緩存中讀取次數(shù) / (總讀取次數(shù)[從緩存中讀取次數(shù) + 從慢速設(shè)備上讀取的次數(shù)])

緩存策略

Eviction policy 移除策略姿染,即如果緩存滿了,從緩存中移除數(shù)據(jù)的策略勉痴;常見的有LFU赫模、LRU、FIFO:

FIFO(First In First Out):先進(jìn)先出算法蒸矛,即先放入緩存的先被移除瀑罗;

LRU(Least Recently Used):最久未使用算法,使用時(shí)間距離現(xiàn)在最久的那個(gè)被移除雏掠;

LFU(Least Frequently Used):最近最少使用算法斩祭,一定時(shí)間段內(nèi)使用次數(shù)(頻率)最少的那個(gè)被移除;

TTL(Time To Live )存活期乡话,即從緩存中創(chuàng)建時(shí)間點(diǎn)開始直到它到期的一個(gè)時(shí)間段(不管在這個(gè)時(shí)間段內(nèi)有沒有訪問都將過期)

TTI(Time To Idle)空閑期摧玫,即一個(gè)數(shù)據(jù)多久沒被訪問將從緩存中移除的時(shí)間。

spring定義了org.springframework.cache.CacheManager和org.springframework.cache.Cache接口來統(tǒng)一不同的緩存技術(shù),而SpringBoot為我們提供了自動(dòng)配置多個(gè)CacheManager的實(shí)現(xiàn)

EhCacheCacheConfiguration.class EhCache實(shí)現(xiàn)緩存

GuavaCacheConfiguration.class Guava實(shí)現(xiàn)緩存

JCacheCacheConfiguration.class JCache實(shí)現(xiàn)緩存

GenericCacheConfiguration.class Collection實(shí)現(xiàn)緩存

SimpleCacheConfiguration.class ConcurrentMap實(shí)現(xiàn)緩存

在不做任何額外配置的情況下绑青,默認(rèn)使用SimpleCacheConfiguration诬像,即ConcurrentMapCacheManager。Springboot支持以“spring.cache”為前綴的屬性來配置闸婴,如:

spring.cache.type=#ehcache,generic,redis,jcache等

spring.cache.cache-names=#緩存名稱

spring.cache.ehcache.config= #ehcache配置文件地址

在Spring Boot中通過@EnableCaching注解自動(dòng)化配置合適的緩存管理器(CacheManager)颅停,Spring Boot根據(jù)下面的順序去偵測(cè)緩存提供者:

Generic

JCache (JSR-107)

EhCache 2.x

Hazelcast

Infinispan

Redis

Guava

Simple

除了按順序偵測(cè)外,我們也可以通過配置屬性spring.cache.type來強(qiáng)制指定掠拳。我們可以通過debug調(diào)試查看cacheManager對(duì)象的實(shí)例來判斷當(dāng)前使用了什么緩存癞揉。

默認(rèn)的ConcurrentMapCacheManager使用步驟:

1. 引入pom.xml

org.springframework.boot

spring-boot-starter-cache

2. 在主類或configuration類中通過 @EnableCaching 開啟緩存

3. @Cacheable 查詢,首先檢查緩存是否存在,如果有則直接從緩存取然后返回喊熟,若沒有則查DB柏肪,并將結(jié)果(有值或空)添加數(shù)據(jù)到緩存中。緩存名稱為people芥牌,緩存key為person的id屬性

參數(shù):

value烦味、cacheNames:兩個(gè)等同的參數(shù)(cacheNames為Spring 4新增,作為value的別名)壁拉,用于指定緩存存儲(chǔ)的集合名谬俄。由于Spring 4中新增了@CacheConfig,因此在Spring 3中原本必須有的value屬性弃理,也成為非必需項(xiàng)了

key:緩存對(duì)象存儲(chǔ)在Map集合中的key值溃论,非必需,缺省按照函數(shù)的所有參數(shù)組合作為key值痘昌,若自己配置需使用SpEL表達(dá)式钥勋,比如:@Cacheable(key = "#p0"):使用函數(shù)第一個(gè)參數(shù)作為緩存的key值,更多關(guān)于SpEL表達(dá)式的詳細(xì)內(nèi)容可參考官方文檔

condition:緩存對(duì)象的條件辆苔,非必需算灸,也需使用SpEL表達(dá)式,只有滿足表達(dá)式條件的內(nèi)容才會(huì)被緩存驻啤,默認(rèn)緩存所有結(jié)果數(shù)據(jù)菲驴。比如:@Cacheable(key = "#p0", condition = "#p0.length() < 3"),表示只有當(dāng)?shù)谝粋€(gè)參數(shù)的長(zhǎng)度小于3的時(shí)候才會(huì)被緩存骑冗,若做此配置上面的AAA用戶就不會(huì)被緩存赊瞬。

4. @CachePut 插入或更新到DB后,檢查緩存中是否有該key沐旨,有則更新森逮,沒有則新增榨婆。新增或更新的內(nèi)容為接口的返回值磁携,所以保存/更新接口必須有返回值。 若返回值為空良风,則緩存也會(huì)為空值谊迄。

參數(shù):同上

5. @CacheEvict 表示從緩存people中刪除key為id的數(shù)據(jù)

參數(shù):除上述之外,還有2個(gè)烟央。

allEntries:非必需统诺,默認(rèn)為false。當(dāng)為true時(shí)疑俭,會(huì)移除所有數(shù)據(jù)

beforeInvocation:非必需粮呢,默認(rèn)為false,會(huì)在調(diào)用方法之后移除數(shù)據(jù)。當(dāng)為true時(shí)啄寡,會(huì)在調(diào)用方法之前移除數(shù)據(jù)豪硅。

ehcache使用步驟:

1. pom.xml引入依賴:

net.sf.ehcache

ehcache

2.8.3

2. 在src/main/resources目錄下創(chuàng)建:ehcache.xml

xsi:noNamespaceSchemaLocation="ehcache.xsd">

maxEntriesLocalHeap="200"

timeToLiveSeconds="600">

或配置

spring.cache.type=ehcache

spring.cache.ehcache.config=classpath:config/another-config.xml

redis使用步驟:

1. pom.xml引入依賴:

org.springframework.boot

spring-boot-starter-redis

2. properties中配置redis端口等

3. 配置RedisCacheManager,RedisTemplate的bean挺物,具體參考源碼

綜合說明:

1. spring cache是spring3.1就有的概念懒浮,通過AOP實(shí)現(xiàn),提供注解方式识藤,但由于是進(jìn)程內(nèi)的緩存砚著,適合于單機(jī),分布式環(huán)境下不適用痴昧。EhCache提供了集群環(huán)境下的緩存同步策略稽穆,但是同步依然需要一定的時(shí)間,短暫的緩存不一致依然存在剪个。在一些要求高一致性(任何數(shù)據(jù)變化都能及時(shí)的被查詢到)的系統(tǒng)和應(yīng)用中秧骑,就不能再使用EhCache來解決了,這個(gè)時(shí)候使用集中式緩存是個(gè)不錯(cuò)的選擇

2. redis是集中式緩存扣囊,通過上述注解方式使用redisCacheManager乎折,則緩存數(shù)據(jù)存儲(chǔ)在redis,保證分布式環(huán)境數(shù)據(jù)一致性侵歇。

實(shí)例源碼:?test1-cache

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末骂澄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惕虑,更是在濱河造成了極大的恐慌坟冲,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溃蔫,死亡現(xiàn)場(chǎng)離奇詭異健提,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)伟叛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門私痹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人统刮,你說我怎么就攤上這事紊遵。” “怎么了侥蒙?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵暗膜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我鞭衩,道長(zhǎng)学搜,這世上最難降的妖魔是什么娃善? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮瑞佩,結(jié)果婚禮上会放,老公的妹妹穿的比我還像新娘。我一直安慰自己钉凌,他們只是感情好咧最,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著御雕,像睡著了一般矢沿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酸纲,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天捣鲸,我揣著相機(jī)與錄音,去河邊找鬼闽坡。 笑死栽惶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疾嗅。 我是一名探鬼主播外厂,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼代承!你這毒婦竟也來了汁蝶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤论悴,失蹤者是張志新(化名)和其女友劉穎掖棉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膀估,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡幔亥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了察纯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帕棉。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖捐寥,靈堂內(nèi)的尸體忽然破棺而出笤昨,到底是詐尸還是另有隱情祖驱,我是刑警寧澤握恳,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站捺僻,受9級(jí)特大地震影響乡洼,放射性物質(zhì)發(fā)生泄漏崇裁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一束昵、第九天 我趴在偏房一處隱蔽的房頂上張望拔稳。 院中可真熱鬧,春花似錦锹雏、人聲如沸巴比。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轻绞。三九已至,卻和暖如春佣耐,著一層夾襖步出監(jiān)牢的瞬間政勃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工兼砖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奸远,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓讽挟,卻偏偏與公主長(zhǎng)得像懒叛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子耽梅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理芍瑞,服務(wù)發(fā)現(xiàn),斷路器褐墅,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評(píng)論 6 342
  • application的配置屬性拆檬。 這些屬性是否生效取決于對(duì)應(yīng)的組件是否聲明為Spring應(yīng)用程序上下文里的Bea...
    新簽名閱讀 5,358評(píng)論 1 27
  • 這些屬性是否生效取決于對(duì)應(yīng)的組件是否聲明為 Spring 應(yīng)用程序上下文里的 Bean(基本是自動(dòng)配置的),為一個(gè)...
    發(fā)光的魚閱讀 1,421評(píng)論 0 14
  • 一妥凳、簡(jiǎn)介 Ehcache是一個(gè)用Java實(shí)現(xiàn)的使用簡(jiǎn)單竟贯,高速,實(shí)現(xiàn)線程安全的緩存管理類庫逝钥,ehcache提供了用內(nèi)...
    小程故事多閱讀 43,823評(píng)論 9 59