电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

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

本文主要知識點:

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

本項目借助SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA + redis5.0進行開發開一個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類,當我們訪問它修飾的方法時,優先從緩存中獲取,若緩存中存在,則直接獲取緩存的值;緩存不存在時,執行方法,并將結果寫入緩存這個注解,有兩個比較核心的設置

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

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

一個簡單的使用姿勢

/** * 首先從緩存中查,查到之后,直接返回緩存數據;否則執行方法,并將結果緩存 * <p> * redisKey: cacheNames + key 組合而成 --> 支持SpEL * redisValue: 返回結果 * * @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為偶數的時候,才走緩存;否則不寫緩存接下來是unless參數,從名字上可以看出它表示不滿足條件時才寫入緩存

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

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

/** * 不管緩存有沒有,都寫入緩存 * * @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

在實際的工作中,經常會遇到一個數據變動,更新多個緩存的場景,對于這個場景,可以通過@Caching來實現

/** * caching實現組合,添加緩存,并失效其他的緩存 * * @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緩存取數據,不存在時執行方法并寫入緩存; 失效緩存 t4::age5. 異常時,緩存會怎樣?

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

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

根據實測結果,當age==0時,上面兩個緩存都不會成功

6. 測試用例

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

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

上面這個主要是驗證@Cacheable注解,若緩存不命中,每次返回的結果應該都不一樣,然而實際訪問時,會發現返回的都是相同的

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. 小結

最后管理小結一下Spring提供的幾個緩存注解

@Cacheable: 緩存存在,則從緩存取;否則執行方法,并將返回結果寫入緩存 @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內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 电动葫芦-河北悍象起重机械有限公司 | 水平筛厂家-三轴椭圆水平振动筛-泥沙震动筛设备_山东奥凯诺矿机 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 纸箱抗压机,拉力机,脂肪测定仪,定氮仪-山东德瑞克仪器有限公司 | 齿轮减速马达一体式_蜗轮蜗杆减速机配电机-德国BOSERL齿轮减速电动机生产厂家 | 集装袋吨袋生产厂家-噸袋廠傢-塑料编织袋-纸塑复合袋-二手吨袋-太空袋-曹县建烨包装 | 玻璃瓶厂家_酱菜瓶厂家_饮料瓶厂家_酒瓶厂家_玻璃杯厂家_徐州东明玻璃制品有限公司 | 亚洲工业智能制造领域专业门户网站 - 亚洲自动化与机器人网 | 济南网站建设_济南网站制作_济南网站设计_济南网站建设公司_富库网络旗下模易宝_模板建站 | 上海小程序开发-上海小程序制作公司-上海网站建设-公众号开发运营-软件外包公司-咏熠科技 | 三佳互联一站式网站建设服务|网站开发|网站设计|网站搭建服务商 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | 桨叶搅拌机_螺旋挤压/方盒旋切造粒机厂家-无锡市鸿诚输送机械有限公司 | 氧氮氢联合测定仪-联测仪-氧氮氢元素分析仪-江苏品彦光电 | 示波器高压差分探头-国产电流探头厂家-南京桑润斯电子科技有限公司 | 菏泽知彼网络科技有限公司| 出国劳务公司_正规派遣公司[严海] | 三轴曲线机-端子插拔力试验机|华杰仪器 | 执业药师报名时间,报考条件,考试时间-首页入口 | 防伪溯源|防窜货|微信二维码营销|兆信_行业内领先的防伪防窜货数字化营销解决方案供应商 | 丹佛斯压力传感器,WISE温度传感器,WISE压力开关,丹佛斯温度开关-上海力笙工业设备有限公司 | 温州中研白癜风专科_温州治疗白癜风_温州治疗白癜风医院哪家好_温州哪里治疗白癜风 | 长沙发电机-湖南发电机-柴油发电机供应厂家-长沙明邦智能科技 | 冲击式破碎机-冲击式制砂机-移动碎石机厂家_青州市富康机械有限公司 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 骨龄仪_骨龄检测仪_儿童骨龄测试仪_品牌生产厂家【品源医疗】 | 动库网动库商城-体育用品专卖店:羽毛球,乒乓球拍,网球,户外装备,运动鞋,运动包,运动服饰专卖店-正品运动品网上商城动库商城网 - 动库商城 | 北京公寓出租网-北京酒店式公寓出租平台| 冷藏车-东风吸污车-纯电动环卫车-污水净化车-应急特勤保障车-程力专汽厂家-程力专用汽车股份有限公司销售二十一分公司 | 【甲方装饰】合肥工装公司-合肥装修设计公司,专业从事安徽办公室、店面、售楼部、餐饮店、厂房装修设计服务 | 定坤静电科技静电消除器厂家-除静电设备 | 空气能暖气片,暖气片厂家,山东暖气片,临沂暖气片-临沂永超暖通设备有限公司 | 寮步纸箱厂_东莞纸箱厂 _东莞纸箱加工厂-东莞市寮步恒辉纸制品厂 | 免费分销系统 — 分销商城系统_分销小程序开发 -【微商来】 | 粒米特测控技术(上海)有限公司-测功机_减速机测试台_电机测试台 | 耳模扫描仪-定制耳机设计软件-DLP打印机-asiga打印机-fitshape「飞特西普」 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 管理会计网-PCMA初级管理会计,中级管理会计考试网站 | 定时排水阀/排气阀-仪表三通旋塞阀-直角式脉冲电磁阀-永嘉良科阀门有限公司 | 菲希尔X射线测厚仪-菲希尔库伦法测厚仪-无锡骏展仪器有限责任公司 | 碳钢法兰厂家,非标法兰,定制异型,法兰生产厂家-河北九瑞管道 | 山东锐智科电检测仪器有限公司_超声波测厚仪,涂层测厚仪,里氏硬度计,电火花检漏仪,地下管线探测仪 | 碳化硅,氮化硅,冰晶石,绢云母,氟化铝,白刚玉,棕刚玉,石墨,铝粉,铁粉,金属硅粉,金属铝粉,氧化铝粉,硅微粉,蓝晶石,红柱石,莫来石,粉煤灰,三聚磷酸钠,六偏磷酸钠,硫酸镁-皓泉新材料 |