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

您的位置:首頁技術文章
文章詳情頁

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

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

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

本文主要知識點:

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

本項目借助SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA + redis5.0進行開發(fā)開一個web服務用于測試

<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>

全程使用默認配置,redis本機,端口6379,無密碼

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

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

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

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

一個簡單的使用姿勢

/** * 首先從緩存中查,查到之后,直接返回緩存數(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

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

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

上面這個case中,age為偶數(shù)的時候,才走緩存;否則不寫緩存接下來是unless參數(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

這個就是我們理解的刪除緩存

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

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

/** * caching實現(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();}

上面這個就是組合操作

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

上面的幾個case,都是正常的場景,當方法拋出異常時,這個緩存表現(xiàn)會怎樣?

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

根據(jù)實測結(jié)果,當age==0時,上面兩個緩存都不會成功

6. 測試用例

接下來驗證下緩存注解與上面描述的是否一致

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

上面這個主要是驗證@Cacheable注解,若緩存不命中,每次返回的結(jié)果應該都不一樣,然而實際訪問時,會發(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

剩下其他的相關測試類就比較好理解了,一并貼出對應的代碼

@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提供的幾個緩存注解

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

上面雖說可以滿足常見的緩存使用場景,但是有一個非常重要的點沒有說明,緩存失效時間應該怎么設置???如何給每個緩存設置不同的緩存失效時間,咱么下篇博文見,我是一灰灰,歡迎關注長草的公眾號一灰灰blog

III. 不能錯過的源碼和相關知識點0. 項目

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

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

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美精品99| 老司机精品视频在线播放| 日韩黄色大片| 国产精品久久久一区二区| 亚洲一区二区三区免费在线观看| 国产激情精品一区二区三区| 亚洲乱码久久| 爽好久久久欧美精品| 久久久久久久久99精品大| 久久99免费视频| 影音先锋久久精品| 久久最新视频| 红桃视频亚洲| 久久在线免费| 日本美女一区| 亚洲1234区| 久久久夜夜夜| 精品亚洲美女网站| 国产精品chinese| 日韩精品午夜视频| 免费在线观看精品| 99国产精品99久久久久久粉嫩| 亚洲韩日在线| 亚洲国产日韩欧美在线| 日韩午夜高潮| 日韩欧美三区| 97se亚洲| 精品视频免费| 日韩精品看片| 亚洲欧美日本视频在线观看| 久久福利毛片| 国产欧美一区二区三区米奇| 日韩av一区二区三区| 欧美一区网站| 麻豆精品视频在线| 午夜欧美精品| 亚洲va中文在线播放免费| 久久久久.com| 日韩影院在线观看| 欧美日韩一区二区三区在线电影| 日韩精品不卡一区二区| 毛片不卡一区二区| 日韩高清一级| 国产伦久视频在线观看| 国产不卡人人| 久久在线免费| 日韩精品视频中文字幕| 久久国产视频网| 欧美一区成人| 亚洲夜间福利| 麻豆精品少妇| 日韩激情综合| 国产精品日本欧美一区二区三区| 欧美一区二区三区免费看| 在线成人直播| 国产一区二区三区免费在线| 亚洲精品在线国产| 午夜在线一区| 日本精品另类| 亚洲激情欧美| 91精品国产自产在线观看永久∴| 国产亚洲毛片| 亚洲91网站| 久久精品国产福利| 日韩动漫一区| 欧美另类中文字幕 | 日韩伦理福利| 久久激情五月婷婷| 亚洲精品第一| 久久网站免费观看| 国产在线不卡一区二区三区| 久久精品123| 天堂俺去俺来也www久久婷婷| 国产伦乱精品| 日韩一区免费| 日本v片在线高清不卡在线观看| 在线手机中文字幕| 国产麻豆一区二区三区精品视频| 久久亚洲欧美| 中文字幕日韩高清在线| 国产欧美日本| 欧美激情日韩| 日韩精品电影| bbw在线视频| 欧美日韩在线观看首页| 福利视频一区| 国产三级一区| 国产日韩欧美一区二区三区在线观看| 日本久久一区| 欧美aaaaaa午夜精品| 在线看片福利| 精品国产精品久久一区免费式 | 国产伦一区二区三区| 久久久影院免费| 麻豆国产91在线播放| 欧美高清一区| 日韩av一区二区三区四区| 欧美午夜不卡| 麻豆91小视频| 丝袜脚交一区二区| 三级在线观看一区二区| 精品国产一区二| 精品久久精品| 国产91在线播放精品| 日韩精品首页| 99国产成+人+综合+亚洲欧美| 国产精品精品国产一区二区| 日本精品黄色| 国产女人18毛片水真多18精品| 久久国产尿小便嘘嘘| 日韩av免费大片| 波多视频一区| 成人免费电影网址| 亚洲天堂日韩在线| 精品国产一区二区三区2021| 麻豆成人在线观看| 免费污视频在线一区| 激情综合自拍| 国产精品视频一区二区三区| 99精品在线观看| 久久先锋影音| 精品一区二区三区在线观看视频| 日韩一区二区免费看| 欧美好骚综合网| 超碰99在线| 在线人成日本视频| 久久精品欧洲| 日韩不卡免费视频| 亚洲精品在线国产| 亚洲精品少妇| 欧美日韩一区二区综合 | 亚洲精品午夜av福利久久蜜桃| 91久久午夜| 国产精品a级| 亚洲激情偷拍| 免费观看不卡av| 日本成人手机在线| 97精品国产福利一区二区三区| 国产一区导航| 丝袜美腿高跟呻吟高潮一区| 青青草91视频| 婷婷中文字幕一区| 91一区二区三区四区| 欧美另类综合| 不卡中文一二三区| 久久中文字幕av| 国产精品久久久久久久久久白浆 | 国产一区二区三区不卡视频网站| 亚洲aⅴ网站| 国产午夜精品一区在线观看| 国产精品毛片久久久| 久久电影tv| 午夜精品一区二区三区国产| 美女久久网站| 欧美aⅴ一区二区三区视频| 久久久久久婷| 91亚洲无吗| 日韩视频1区| 日韩不卡一区| av成人国产| 欧美日韩一区二区综合 | 国产亚洲网站| 婷婷成人在线| 国产欧美自拍| jiujiure精品视频播放| 蜜臀久久久久久久| 亚洲高清影视| 丁香婷婷久久| 综合精品一区| 久久激情五月激情| 国产二区精品| 91免费精品| 国产精品色在线网站| 日韩国产精品久久久| 日韩激情网站| 久久免费黄色| 日本国产一区| 香蕉成人久久| 日本精品在线中文字幕| 日韩和欧美的一区| 亚洲精品福利| 日韩欧美激情| 精品一区二区三区四区五区| 国产精品日本欧美一区二区三区| 国产 日韩 欧美 综合 一区| 日韩欧美久久| 亚洲丝袜美腿一区| 亚洲深夜av| 国产精品av久久久久久麻豆网| 成人国产精品一区二区网站| 国产精品日韩精品在线播放| 日韩二区三区四区| 日韩欧美2区| 日韩av一二三| 国产精品二区影院| 日韩av影院| 国产精品白丝av嫩草影院| 欧美亚洲自偷自偷| 久久91导航| 欧美精品中文|