日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Spring緩存注解@Cacheable @CacheEvit @CachePut使用介紹

瀏覽:82日期:2023-07-04 14:46:03
目錄I. 項(xiàng)目環(huán)境1. 項(xiàng)目依賴II. 緩存注解介紹1. @Cacheable2. @CachePut3. @CacheEvict4. @Caching5. 異常時(shí),緩存會(huì)怎樣?6. 測(cè)試用例7. 小結(jié)III. 不能錯(cuò)過的源碼和相關(guān)知識(shí)點(diǎn)0. 項(xiàng)目

Spring在3.1版本,就提供了一條基于注解的緩存策略,實(shí)際使用起來還是很絲滑的,本文將針對(duì)幾個(gè)常用的注解進(jìn)行簡(jiǎn)單的介紹說明,有需要的小伙伴可以嘗試一下

本文主要知識(shí)點(diǎn):

@Cacheable: 緩存存在,則使用緩存;不存在,則執(zhí)行方法,并將結(jié)果塞入緩存 @CacheEvit: 失效緩存 @CachePut: 更新緩存I. 項(xiàng)目環(huán)境1. 項(xiàng)目依賴

本項(xiàng)目借助SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA + redis5.0進(jìn)行開發(fā)開一個(gè)web服務(wù)用于測(cè)試

<dependencies> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency></dependencies>

全程使用默認(rèn)配置,redis本機(jī),端口6379,無密碼

II. 緩存注解介紹1. @Cacheable

這個(gè)注解用于修飾方法or類,當(dāng)我們?cè)L問它修飾的方法時(shí),優(yōu)先從緩存中獲取,若緩存中存在,則直接獲取緩存的值;緩存不存在時(shí),執(zhí)行方法,并將結(jié)果寫入緩存這個(gè)注解,有兩個(gè)比較核心的設(shè)置

/** * 與 cacheNames 效果等價(jià) */ @AliasFor('cacheNames') String[] value() default {}; @AliasFor('value') String[] cacheNames() default {}; /** * 緩存key */ String key() default '';

cacheNames可以理解為緩存key的前綴,可以為組件緩存的key變量;當(dāng)key不設(shè)置時(shí),使用方法參數(shù)來初始化,注意key為SpEL表達(dá)式,因此如果要寫字符串時(shí),用單引號(hào)括起來

一個(gè)簡(jiǎn)單的使用姿勢(shì)

/** * 首先從緩存中查,查到之后,直接返回緩存數(shù)據(jù);否則執(zhí)行方法,并將結(jié)果緩存 * <p> * redisKey: cacheNames + key 組合而成 --> 支持SpEL * redisValue: 返回結(jié)果 * * @param name * @return */@Cacheable(cacheNames = 'say', key = '’p_’+ #name')public String sayHello(String name) { return 'hello+' + name + '-->' + UUID.randomUUID().toString();}

如我們傳參為 yihuihui, 那么緩存key為 say::p_yihuihui

除了上面三個(gè)配置值之外,查看@Cacheable注解源碼的童鞋可以看到還有condition設(shè)置,這個(gè)表示當(dāng)它設(shè)置的條件達(dá)成時(shí),才寫入緩存

/** * 滿足condition條件的才寫入緩存 * * @param age * @return */@Cacheable(cacheNames = 'condition', key = '#age', condition = '#age % 2 == 0')public String setByCondition(int age) { return 'condition:' + age + '-->' + UUID.randomUUID().toString();}

上面這個(gè)case中,age為偶數(shù)的時(shí)候,才走緩存;否則不寫緩存接下來是unless參數(shù),從名字上可以看出它表示不滿足條件時(shí)才寫入緩存

/** * unless, 不滿足條件才寫入緩存 * * @param age * @return */@Cacheable(cacheNames = 'unless', key = '#age', unless = '#age % 2 == 0')public String setUnless(int age) { return 'unless:' + age + '-->' + UUID.randomUUID().toString();}2. @CachePut

不管緩存有沒有,都將方法的返回結(jié)果寫入緩存;適用于緩存更新

/** * 不管緩存有沒有,都寫入緩存 * * @param age * @return */@CachePut(cacheNames = 't4', key = '#age')public String cachePut(int age) { return 't4:' + age + '-->' + UUID.randomUUID().toString();}3. @CacheEvict

這個(gè)就是我們理解的刪除緩存

/** * 失效緩存 * * @param name * @return */@CacheEvict(cacheNames = 'say', key = '’p_’+ #name')public String evict(String name) { return 'evict+' + name + '-->' + UUID.randomUUID().toString();}4. @Caching

在實(shí)際的工作中,經(jīng)常會(huì)遇到一個(gè)數(shù)據(jù)變動(dòng),更新多個(gè)緩存的場(chǎng)景,對(duì)于這個(gè)場(chǎng)景,可以通過@Caching來實(shí)現(xiàn)

/** * caching實(shí)現(xiàn)組合,添加緩存,并失效其他的緩存 * * @param age * @return */@Caching(cacheable = @Cacheable(cacheNames = 'caching', key = '#age'), evict = @CacheEvict(cacheNames = 't4', key = '#age'))public String caching(int age) { return 'caching: ' + age + '-->' + UUID.randomUUID().toString();}

上面這個(gè)就是組合操作

從 caching::age緩存取數(shù)據(jù),不存在時(shí)執(zhí)行方法并寫入緩存; 失效緩存 t4::age5. 異常時(shí),緩存會(huì)怎樣?

上面的幾個(gè)case,都是正常的場(chǎng)景,當(dāng)方法拋出異常時(shí),這個(gè)緩存表現(xiàn)會(huì)怎樣?

/** * 用于測(cè)試異常時(shí),是否會(huì)寫入緩存 * * @param age * @return */@Cacheable(cacheNames = 'exception', key = '#age')@Cacheable(cacheNames = 'say', key = '’p_yihuihui’')public int exception(int age) { return 10 / age;}

根據(jù)實(shí)測(cè)結(jié)果,當(dāng)age==0時(shí),上面兩個(gè)緩存都不會(huì)成功

6. 測(cè)試用例

接下來驗(yàn)證下緩存注解與上面描述的是否一致

@RestControllerpublic class IndexRest { @Autowired private BasicDemo helloService; @GetMapping(path = {'', '/'}) public String hello(String name) {return helloService.sayHello(name); }}

上面這個(gè)主要是驗(yàn)證@Cacheable注解,若緩存不命中,每次返回的結(jié)果應(yīng)該都不一樣,然而實(shí)際訪問時(shí),會(huì)發(fā)現(xiàn)返回的都是相同的

curl http://localhost:8080/?name=yihuihui

失效緩存

@GetMapping(path = 'evict')public String evict(String name) { return helloService.evict(String.valueOf(name));}

失效緩存,需要和上面的case配合起來使用

curl http://localhost:8080/evict?name=yihuihuicurl http://localhost:8080/?name=yihuihui

剩下其他的相關(guān)測(cè)試類就比較好理解了,一并貼出對(duì)應(yīng)的代碼

@GetMapping(path = 'condition')public String t1(int age) { return helloService.setByCondition(age);}@GetMapping(path = 'unless')public String t2(int age) { return helloService.setUnless(age);}@GetMapping(path = 'exception')public String exception(int age) { try {return String.valueOf(helloService.exception(age)); } catch (Exception e) {return e.getMessage(); }}@GetMapping(path = 'cachePut')public String cachePut(int age) { return helloService.cachePut(age);}7. 小結(jié)

最后管理小結(jié)一下Spring提供的幾個(gè)緩存注解

@Cacheable: 緩存存在,則從緩存取;否則執(zhí)行方法,并將返回結(jié)果寫入緩存 @CacheEvit: 失效緩存 @CachePut: 更新緩存 @Caching: 都注解組合

上面雖說可以滿足常見的緩存使用場(chǎng)景,但是有一個(gè)非常重要的點(diǎn)沒有說明,緩存失效時(shí)間應(yīng)該怎么設(shè)置???如何給每個(gè)緩存設(shè)置不同的緩存失效時(shí)間,咱么下篇博文見,我是一灰灰,歡迎關(guān)注長(zhǎng)草的公眾號(hào)一灰灰blog

III. 不能錯(cuò)過的源碼和相關(guān)知識(shí)點(diǎn)0. 項(xiàng)目

工程:https://github.com/liuyueyi/spring-boot-demo源碼:https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/125-cache-ano

到此這篇關(guān)于Spring緩存注解@Cacheable @CacheEvit @CachePut使用介紹的文章就介紹到這了,更多相關(guān)Spring @Cacheable @CacheEvit @CachePut內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产九一精品| 夜夜嗨一区二区三区| 91久久久久| 婷婷成人综合| 激情五月色综合国产精品| 国产一区日韩| 久久精品三级| 免费福利视频一区二区三区| 久久精品国产www456c0m| 日韩欧美1区| 国产视频亚洲| 日本a级不卡| 精品日韩一区| 亚洲二区三区不卡| 国产一区二区三区亚洲| 久久婷婷亚洲| 九九综合九九| 美美哒免费高清在线观看视频一区二区| 免费欧美日韩| 国产精品一区免费在线| 欧美日韩a区| 欧美aⅴ一区二区三区视频| 国产日韩欧美| 中文字幕色婷婷在线视频| 91看片一区| 亚洲欧美日本国产专区一区| 久久久国产精品网站| 日韩国产激情| 中文字幕av一区二区三区人| 久久av综合| 视频在线在亚洲| 日韩在线短视频| 性感美女一区二区在线观看| 宅男噜噜噜66国产日韩在线观看| 日韩av一二三| 成人在线视频区| 亚洲美女91| 99精品在线观看| 亚洲精品免费观看| 日韩毛片在线| 精品中文字幕一区二区三区四区| 精品在线播放| 久久精品亚洲一区二区| 蜜臀久久99精品久久久画质超高清| 另类综合日韩欧美亚洲| 国产精品试看| 久久久夜夜夜| 国产夫妻在线| 麻豆久久一区| 日韩国产欧美三级| 一区二区小说| 国产成人调教视频在线观看| 成人福利视频| 免费的成人av| 在线视频亚洲| 亚洲国产专区校园欧美| а√在线中文在线新版| 免费日韩一区二区三区| 中文字幕亚洲在线观看| 午夜在线精品偷拍| 在线亚洲观看| 午夜在线播放视频欧美| 午夜久久一区| 女同性一区二区三区人了人一| 久久精品影视| 日韩.com| av日韩中文| 久久精品国产99久久| 久久久久免费av| 亚洲激情不卡| 男人操女人的视频在线观看欧美| 奇米亚洲欧美| 亚洲欧美日韩精品一区二区 | 黄色在线网站噜噜噜| 美女毛片一区二区三区四区最新中文字幕亚洲| 深夜福利一区| 国产精品chinese| 成人午夜在线| 欧洲亚洲一区二区三区| 日韩国产在线| 亚洲少妇在线| 国产调教精品| 国产夫妻在线| 亚洲精品2区| 欧美日韩 国产精品| 国产精品99视频| 欧美日韩中文字幕一区二区三区| 午夜国产欧美理论在线播放| 亚洲精品一级| 日韩av免费大片| 免费在线成人网| 日韩另类视频| 久久国产亚洲精品| 男女性色大片免费观看一区二区 | 老牛国内精品亚洲成av人片| 在线精品亚洲欧美日韩国产| 亚洲欧美日韩视频二区| 国产精品porn| 99视频一区| 久草精品视频| 久久av在线| 成人一区不卡| 色8久久久久| 久久久久久久久丰满| 亚洲精品黄色| 日韩在线欧美| 日韩精品一卡二卡三卡四卡无卡| 国产成人精选| 精品亚洲自拍| 91一区二区| 亚洲在线国产日韩欧美| 亚洲欧洲av| 秋霞国产精品| 久久中文精品| 欧美一区91| 在线免费观看亚洲| 成人高清一区| 综合激情视频| 91综合网人人| 日本成人中文字幕在线视频| 欧美日一区二区| 欧美日韩一区二区三区不卡视频 | 婷婷中文字幕一区| 国产美女久久| 亚洲视频二区| 亚洲在线一区| 丰满少妇一区| 国产精品久久久久久久久久10秀 | 欧美一区影院| 亚洲九九精品| 日本不卡一二三区黄网| 五月精品视频| 久久精品国产www456c0m| 久久久久国产精品一区三寸| 丰满少妇一区| 伊人久久国产| 日韩欧美二区| 色老板在线视频一区二区| 亚洲v在线看| 欧美特黄视频| 中文字幕日韩高清在线| 亚洲精品激情| 日本不卡在线视频| 日本欧美在线看| 欧美日韩精品在线一区| 国产毛片久久| 日韩综合一区二区| 最近国产精品视频| 亚洲精品乱码| 日韩精品国产精品| 国产精品最新| 欧美精品国产一区| 欧美激情网址| 国产videos久久| 亚洲高清影视| 欧美亚洲二区| 欧美黄色网页| 亚洲在线网站| 久久国产精品免费精品3p| 精品久久一区| 悠悠资源网久久精品| 国产精品一区二区精品| av综合电影网站| 亚洲久久视频| 欧美国产美女| 日韩精品亚洲专区| 欧美日韩国产高清电影| 国产欧美日本| 国产99亚洲| 欧美日韩午夜电影网| 国产精品精品国产一区二区| 视频一区二区三区在线| 国产精品入口久久| 久久网站免费观看| 日韩国产精品久久久| 成人在线超碰| 日韩av中文字幕一区| 国产精品99免费看| 欧美激情视频一区二区三区在线播放| 免费精品国产的网站免费观看| 久久亚洲精精品中文字幕| 亚洲色图综合| 亚洲91视频| 成人片免费看| 成人在线丰满少妇av| 国产精品欧美在线观看| 中文亚洲免费| 91tv亚洲精品香蕉国产一区| 日韩不卡一二三区| 日韩成人av影视| 午夜欧美理论片| 国产精品综合| 亚洲精品123区| 蜜桃精品在线| 精品一区电影| 国产精品1区| 国产欧美欧美| 国产日韩欧美一区二区三区在线观看| 欧美在线综合| 国产午夜精品一区二区三区欧美|