作者最近在開發(fā)公司項目時使用到 Redis 緩存,并在翻看前人代碼時,看到了一種關(guān)于 @Cacheable 注解的自定義緩存有效期的解決方案,感覺比較實用,因此作者自己拓展完善了一番后分享給各位。 Spring 緩存常規(guī)配置 Spring Cache 框架給我們提供了 @Cacheable 注解用于緩存方法返回內(nèi)容。但是 @Cacheable 注解不能定義緩存有效期。這樣的話在一些需要自定義緩存有效期的場景就不太實用。 按照 Spring Cache 框架給我們提供的 RedisCacheManager 實現(xiàn),只能在全局設(shè)置緩存有效期。這里給大家看一個常規(guī)的 CacheConfig 緩存配置類,代碼如下, @EnableCaching @Configuration publicclassCacheConfigextendsCachingConfigurerSupport{ ... privateRedisSerializerkeySerializer(){ returnnewStringRedisSerializer(); } privateRedisSerializervalueSerializer(){ returnnewGenericFastJsonRedisSerializer(); } publicstaticfinalStringCACHE_PREFIX="crowd:"; @Bean publicCacheManagercacheManager(RedisConnectionFactoryredisConnectionFactory){ //配置序列化(解決亂碼的問題) RedisCacheConfigurationconfig=RedisCacheConfiguration.defaultCacheConfig() //設(shè)置key為String .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer())) //設(shè)置value為自動轉(zhuǎn)Json的Object .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(valueSerializer())) .computePrefixWith(name->CACHE_PREFIX+name+":") .entryTtl(Duration.ofSeconds(600)); RedisCacheWriterredisCacheWriter=RedisCacheWriter.nonLockingRedisCacheWriter(Objects.requireNonNull(redisConnectionFactory)); returnnewRedisCacheManager(redisCacheWriter,config); } } 這里面簡單對 RedisCacheConfiguration 緩存配置做一下說明: serializeKeysWith():設(shè)置 Redis 的 key 的序列化規(guī)則。 erializeValuesWith():設(shè)置 Redis 的 value 的序列化規(guī)則。 computePrefixWith():計算 Redis 的 key 前綴。 entryTtl():全局設(shè)置 @Cacheable 注解緩存的有效期。 那么使用如上配置生成的 Redis 緩存 key 名稱是什么樣得嘞?這里用開源項目 crowd-admin 的 ConfigServiceImpl 類下 getValueByKey(String key) 方法舉例, @Cacheable(value="configCache",key="#root.methodName+'_'+#root.args[0]") @Override publicStringgetValueByKey(Stringkey){ QueryWrapperwrapper=newQueryWrapper<>(); wrapper.eq("configKey",key); Configconfig=getOne(wrapper); if(config==null){ returnnull; } returnconfig.getConfigValue(); } 執(zhí)行此方法后,Redis 中緩存 key 名稱如下, crowdgetValueByKey_sys.name TTL 過期時間是 287,跟我們?nèi)衷O(shè)置的 300 秒基本是一致的。此時假如我們想把 getValueByKey 方法的緩存有效期單獨設(shè)置為 600 秒,那我們該如何操作嘞? @Cacheable 注解默認是沒有提供有關(guān)緩存有效期設(shè)置的。想要單獨修改 getValueByKey 方法的緩存有效期只能修改全局的緩存有效期。那么有沒有別的方法能夠為 getValueByKey 方法單獨設(shè)置緩存有效期嘞?當(dāng)然是有的,大家請往下看。 自定義 MyRedisCacheManager 緩存 其實我們可以通過自定義 MyRedisCacheManager 類繼承 Spring Cache 提供的 RedisCacheManager 類后,重寫 createRedisCache(String name, RedisCacheConfiguration cacheConfig) 方法,代碼如下, publicclassMyRedisCacheManagerextendsRedisCacheManager{ publicMyRedisCacheManager(RedisCacheWritercacheWriter,RedisCacheConfigurationdefaultCacheConfiguration){ super(cacheWriter,defaultCacheConfiguration); } @Override protectedRedisCachecreateRedisCache(Stringname,RedisCacheConfigurationcacheConfig){ String[]array=StringUtils.split(name,"#"); name=array[0]; //解析@Cacheable注解的value屬性用以單獨設(shè)置有效期 if(array.length>1){ longttl=Long.parseLong(array[1]); cacheConfig=cacheConfig.entryTtl(Duration.ofSeconds(ttl)); } returnsuper.createRedisCache(name,cacheConfig); } } MyRedisCacheManager 類邏輯如下, 繼承 Spring Cache 提供的 RedisCacheManager 類。 重寫 createRedisCache(String name, RedisCacheConfiguration cacheConfig) 方法。 解析 name 參數(shù),根據(jù) # 字符串進行分割,獲取緩存 key 名稱以及緩存有效期。 接著我們修改下 CacheConfig 類的 cacheManager 方法用以使用 MyRedisCacheManager 類。代碼如下, @Bean publicCacheManagercacheManager(RedisConnectionFactoryredisConnectionFactory){ returnnewMyRedisCacheManager(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory),defaultCacheConfig()); } privateRedisCacheConfigurationdefaultCacheConfig(){ returnRedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer())) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(valueSerializer())) .computePrefixWith(name->CACHE_PREFIX+name+":") .entryTtl(Duration.ofSeconds(600)); } 最后我們修改下 @Cacheable 注解使用方式,在原有 value 屬性的 configCache 值后添加 #600,單獨標(biāo)識緩存有效期。代碼如下, @Cacheable(value="configCache#600",key="#root.methodName+'_'+#root.args[0]") @Override publicStringgetValueByKey(Stringkey){ ... } 看下 getValueByKey 方法生成的 Redis 緩存 key 有效期是多久。如下, OK,看到是 590 秒有效期后,我們就大功告成了,希望本文能對大家有所幫助。 審核編輯:劉清 聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴 Cache Cache +關(guān)注 關(guān)注 0 文章 129 瀏覽量 28977 緩存器 緩存器 +關(guān)注 關(guān)注 0 文章 63 瀏覽量 11853 Redis Redis +關(guān)注 關(guān)注 0 文章 385 瀏覽量 11368 原文標(biāo)題:Spring Cache 緩存注解這樣用,實在是太香了! 文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。 收藏 0人收藏 掃一掃,分享給好友 復(fù)制鏈接分享 加入交流群 掃碼添加小助手 加入工程師交流群 評論 發(fā)布評論請先 登錄 相關(guān)推薦 熱點推薦 CPU Cache是如何保證緩存一致性的? 我們介紹`CPU Cache`的組織架構(gòu)及其進行**讀操作**時的尋址方式,但是緩存不僅僅只有讀操作,還有 **寫操作** ,這會帶來一個新的問題 發(fā)表于 12-04 15:05 ?2051次閱讀 基于javaPoet的緩存key優(yōu)化實踐 作者:京東物流 方志民 一. 背景 在一次系統(tǒng)opsreview中,發(fā)現(xiàn)了一些服務(wù)配置了@Cacheable注解。@cacheable 來源于spring cache框架中,作用是使用aop的方式將 發(fā)表于 01-14 15:18 ?782次閱讀 阿里巴巴開源的通用緩存訪問框架JetCache介紹 摘要: JetCache是由阿里巴巴開源的通用緩存訪問框架,如果你對Spring Cache很熟悉的話,請一定花一點時間了解一下JetCache,它更好用。JetCache可以做類似Sprin 發(fā)表于 04-24 16:09 L2 Cache配置方案那種更好? 對于其它外設(shè)不會修改,即只有CPU進行讀寫的數(shù)據(jù),有兩種配置方案:1.將L2 Cache配置為SRAM,數(shù)據(jù)存于L2 Cache,即數(shù)據(jù)直接放置于L2 發(fā)表于 08-05 14:50 高速緩存(cache)的工作原理是什么?高速緩存可分為哪幾類 存儲器系統(tǒng)的層次架構(gòu)是如何構(gòu)成的?高速緩存(cache)的工作原理是什么?高速緩存可分為哪幾類? 發(fā)表于 12-23 06:18 高速緩存Cache介紹 被訪問,那么將來它附近的位置也會被訪問。比如順序執(zhí)行代碼,或者使用一個數(shù)據(jù)結(jié)構(gòu)? 時間局部性:被訪問過一次的存儲器位置,接下來會被多次引用。比如:循環(huán)? 緩存行(cache line)? 邏輯上的一組 發(fā)表于 09-07 08:22 什么是緩存Cache 什么是緩存Cache 即高速緩沖存儲器,是位于CPU與主內(nèi)存間的一種容量較小但速度很高的存儲器。由于CPU的速度遠高于主內(nèi)存,CPU直接 發(fā)表于 01-23 10:57 ?964次閱讀 什么是Cache 什么是Cache 英文縮寫: Cache 中文譯名: 高速緩存器 分 類: IP與多媒體 解 釋: 信息在本地的臨時存儲 發(fā)表于 02-22 17:26 ?1075次閱讀 高速緩存(Cache),高速緩存(Cache)原理是什么? 高速緩存(Cache),高速緩存(Cache)原理是什么? 高速緩存Cache是位于CPU和主 發(fā)表于 03-26 10:49 ?7002次閱讀 Spring應(yīng)用 1 springXML配置說明 Spring應(yīng)用 1 springXML配置說明 隱式對Spring容器注冊Process ? context:annotation-config / 為了在spring開發(fā)過程中,為 發(fā)表于 01-13 12:20 ?434次閱讀 二級緩存的簡單配置教程詳解 淺談二級緩存之功效 緩存是指可以進行高速數(shù)據(jù)交換的存儲器,它先于內(nèi)存與CPU交換數(shù)據(jù),因此速度很快。L1Cache(一級緩存)是CPU第一層高速緩存。 發(fā)表于 08-14 15:28 ?4603次閱讀 Linux內(nèi)核Page Cache和Buffer Cache兩類緩存的作用及關(guān)系如何 page)即為頁緩存(page cache)。塊緩存(buffer cache),則是內(nèi)核為了加速對底層存儲介質(zhì)的訪問速度,而構(gòu)建的一層緩存 發(fā)表于 07-02 14:25 ?3034次閱讀 AMD 3D V-cache有望改變緩存設(shè)計 在我們談?wù)?3D V-Cache 之前,我們需要先談?wù)?b class='flag-5'>常規(guī)的舊緩存。很久以前,計算機使用兩種基本類型的存儲:硬盤驅(qū)動器和隨機存取存儲器 (RAM)。硬盤驅(qū)動器速度慢但可以存儲大量數(shù)據(jù),而 RAM 只能存儲少量數(shù)據(jù)但速度非常快。 發(fā)表于 02-13 15:58 ?868次閱讀 使用Spring Cache實現(xiàn)緩存 在學(xué)習(xí)Spring Cache之前,筆者經(jīng)常會硬編碼的方式使用緩存。 發(fā)表于 05-11 17:40 ?1122次閱讀 什么是緩存(Cache)及其作用 緩存(Cache)是一種高速存儲器,用于臨時存儲數(shù)據(jù),以便快速訪問。在計算機系統(tǒng)中,緩存的作用是減少處理器訪問主存儲器(如隨機存取存儲器RAM)所需的時間。 緩存( 發(fā)表于 12-18 09:28 ?1w次閱讀 華秋(原“華強聚豐”): 電子發(fā)燒友 華秋開發(fā) 華秋電路(原"華強PCB") 華秋商城(原"華強芯城") 華秋智造 My ElecFans APP 網(wǎng)站地圖 設(shè)計技術(shù) 可編程邏輯 電源/新能源 MEMS/傳感技術(shù) 測量儀表 嵌入式技術(shù) 制造/封裝 模擬技術(shù) RF/無線 接口/總線/驅(qū)動 處理器/DSP EDA/IC設(shè)計 存儲技術(shù) 光電顯示 EMC/EMI設(shè)計 連接器 行業(yè)應(yīng)用 LEDs 汽車電子 音視頻及家電 通信網(wǎng)絡(luò) 醫(yī)療電子 人工智能 虛擬現(xiàn)實 可穿戴設(shè)備 機器人 安全設(shè)備/系統(tǒng) 軍用/航空電子 移動通信 工業(yè)控制 便攜設(shè)備 觸控感測 物聯(lián)網(wǎng) 智能電網(wǎng) 區(qū)塊鏈 新科技 特色內(nèi)容 專欄推薦 學(xué)院 設(shè)計資源 設(shè)計技術(shù) 電子百科 電子視頻 元器件知識 工具箱 VIP會員 最新技術(shù)文章 產(chǎn)品地圖 品牌地圖 社區(qū) 小組 論壇 問答 評測試用 企業(yè)服務(wù) 產(chǎn)品 資料 文章 方案 企業(yè) 供應(yīng)鏈服務(wù) 硬件開發(fā) 華秋電路 華秋商城 華秋智造 nextPCB BOM配單 媒體服務(wù) 網(wǎng)站廣告 在線研討會 活動策劃 新聞發(fā)布 新品發(fā)布 小測驗 設(shè)計大賽 華秋 關(guān)于我們 投資關(guān)系 新聞動態(tài) 加入我們 聯(lián)系我們 舉報投訴 社交網(wǎng)絡(luò) 微博 移動端 發(fā)燒友APP 硬聲APP WAP 聯(lián)系我們 廣告合作 王婉珠:wangwanzhu@elecfans.com 內(nèi)容合作 黃晶晶:huangjingjing@elecfans.com 內(nèi)容合作(海外) 張迎輝:mikezhang@elecfans.com 供應(yīng)鏈服務(wù) PCB/IC/PCBA 江良華:lanhu@huaqiu.com 投資合作 曾海銀:zenghaiyin@huaqiu.com 社區(qū)合作 劉勇:liuyong@huaqiu.com 關(guān)注我們的微信 下載發(fā)燒友APP 電子發(fā)燒友觀察 電子工程師社區(qū) 1-32層PCB打樣·中小批量 元器件現(xiàn)貨·全球代購·SmartBOM SMT貼片·PCBA加工 PCB Manufacturer 華秋簡介 企業(yè)動態(tài) 聯(lián)系我們 企業(yè)文化 企業(yè)宣傳片 加入我們 版權(quán)所有 ? 湖南華秋數(shù)字科技有限公司 長沙市望城經(jīng)濟技術(shù)開發(fā)區(qū)航空路6號手機智能終端產(chǎn)業(yè)園2號廠房3層(0731-88081133) 電子發(fā)燒友 (電路圖) 湘公網(wǎng)安備43011202000918 工商網(wǎng)監(jiān) 湘ICP備2023018690號-1 主站蜘蛛池模板: 丝袜美女被啪啪不带套漫画 | 无止侵犯高H1V3无止侵犯 | 中字幕视频在线永久在线 | 久久精品电影 | 91综合精品网站久久 | 穿白丝袜边走边尿白丝袜 | 国产午夜精品自在自线之la | 国语自产拍大学生在线观看 | 亚洲香蕉视频在线播放 | 国产精品亚洲欧美一区麻豆 | 亚洲欧美中文在线一区 | 我的美女房东未删减版免费观看 | 黄色直接观看 | 粉嫩自拍 偷拍 亚洲 | 国产系列在线亚洲视频 | 国模丽丽啪啪一区二区 | 深夜释放自己在线观看 | 97人视频国产在线观看 | 天天射天天干天天插 | 囯产少妇BBBBBB高潮喷水一 | 亚州日韩精品AV片无码中文 | 亚洲午夜精品A片久久不卡蜜桃 | 欧美精品一区二区三区视频 | 强奷乱码中文字幕熟女免费 | 国产精品久久久久影院免费 | 亚洲妈妈精品一区二区三区 | 永久adc视频年龄确认 | 久久r视频| 麻豆XXXX乱女少妇精品 | 红桃传媒少妇人妻网站无码抽插 | 国产亚洲精品久久无亚洲 | 92电影网午夜福利 | 亚洲成人在线免费观看 | 色欲AV亚洲情无码AV蜜桃 | 迈开腿让我看下你的小草莓声音 | 久久夜色精品国产亚州AV卜 | 91天堂国产在线 在线播放 | 国产色婷亚洲99精品AV | 99视频这里只有精品国产 | 98色精品视频在线 | 男人J桶女人P视频无遮挡网站 | 阅读全文