色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Spring Cache緩存常規配置

jf_ro2CN3Fa ? 來源:waynblog ? 2023-11-28 10:44 ? 次閱讀

作者最近在開發公司項目時使用到 Redis 緩存,并在翻看前人代碼時,看到了一種關于 @Cacheable 注解的自定義緩存有效期的解決方案,感覺比較實用,因此作者自己拓展完善了一番后分享給各位。

Spring 緩存常規配置

Spring Cache 框架給我們提供了 @Cacheable 注解用于緩存方法返回內容。但是 @Cacheable 注解不能定義緩存有效期。這樣的話在一些需要自定義緩存有效期的場景就不太實用。

按照 Spring Cache 框架給我們提供的 RedisCacheManager 實現,只能在全局設置緩存有效期。這里給大家看一個常規的 CacheConfig 緩存配置類,代碼如下,

@EnableCaching
@Configuration
publicclassCacheConfigextendsCachingConfigurerSupport{
...

privateRedisSerializerkeySerializer(){
returnnewStringRedisSerializer();
}

privateRedisSerializervalueSerializer(){
returnnewGenericFastJsonRedisSerializer();
}

publicstaticfinalStringCACHE_PREFIX="crowd:";

@Bean
publicCacheManagercacheManager(RedisConnectionFactoryredisConnectionFactory){
//配置序列化(解決亂碼的問題)
RedisCacheConfigurationconfig=RedisCacheConfiguration.defaultCacheConfig()
//設置key為String
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))
//設置value為自動轉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():設置 Redis 的 key 的序列化規則。

erializeValuesWith():設置 Redis 的 value 的序列化規則。

computePrefixWith():計算 Redis 的 key 前綴。

entryTtl():全局設置 @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();
}

執行此方法后,Redis 中緩存 key 名稱如下,

crowdgetValueByKey_sys.name

d0d19d0e-8d8e-11ee-939d-92fbcf53809c.png

TTL 過期時間是 287,跟我們全局設置的 300 秒基本是一致的。此時假如我們想把 getValueByKey 方法的緩存有效期單獨設置為 600 秒,那我們該如何操作嘞?

@Cacheable 注解默認是沒有提供有關緩存有效期設置的。想要單獨修改 getValueByKey 方法的緩存有效期只能修改全局的緩存有效期。那么有沒有別的方法能夠為 getValueByKey 方法單獨設置緩存有效期嘞?當然是有的,大家請往下看。

自定義 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屬性用以單獨設置有效期
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 參數,根據 # 字符串進行分割,獲取緩存 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,單獨標識緩存有效期。代碼如下,

@Cacheable(value="configCache#600",key="#root.methodName+'_'+#root.args[0]")
@Override
publicStringgetValueByKey(Stringkey){
...
}

看下 getValueByKey 方法生成的 Redis 緩存 key 有效期是多久。如下,

d0efbbcc-8d8e-11ee-939d-92fbcf53809c.png

OK,看到是 590 秒有效期后,我們就大功告成了,希望本文能對大家有所幫助。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Cache
    +關注

    關注

    0

    文章

    129

    瀏覽量

    28389
  • 緩存器
    +關注

    關注

    0

    文章

    63

    瀏覽量

    11684
  • Redis
    +關注

    關注

    0

    文章

    378

    瀏覽量

    10907

原文標題:Spring Cache 緩存注解這樣用,實在是太香了!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    CPU Cache是如何保證緩存一致性的?

    我們介紹`CPU Cache`的組織架構及其進行**讀操作**時的尋址方式,但是緩存不僅僅只有讀操作,還有 **寫操作** ,這會帶來一個新的問題
    的頭像 發表于 12-04 15:05 ?1698次閱讀
    CPU <b class='flag-5'>Cache</b>是如何保證<b class='flag-5'>緩存</b>一致性的?

    基于javaPoet的緩存key優化實踐

    作者:京東物流 方志民 一. 背景 在一次系統opsreview中,發現了一些服務配置了@Cacheable注解。@cacheable 來源于spring cache框架中,作用是使用aop的方式將
    的頭像 發表于 01-14 15:18 ?465次閱讀
    基于javaPoet的<b class='flag-5'>緩存</b>key優化實踐

    阿里巴巴開源的通用緩存訪問框架JetCache介紹

    摘要: JetCache是由阿里巴巴開源的通用緩存訪問框架,如果你對Spring Cache很熟悉的話,請一定花一點時間了解一下JetCache,它更好用。JetCache可以做類似Sprin
    發表于 04-24 16:09

    L2 Cache配置方案那種更好?

    對于其它外設不會修改,即只有CPU進行讀寫的數據,有兩種配置方案:1.將L2 Cache配置為SRAM,數據存于L2 Cache,即數據直接放置于L2
    發表于 08-05 14:50

    高速緩存(cache)的工作原理是什么?高速緩存可分為哪幾類

    存儲器系統的層次架構是如何構成的?高速緩存(cache)的工作原理是什么?高速緩存可分為哪幾類?
    發表于 12-23 06:18

    高速緩存Cache介紹

    被訪問,那么將來它附近的位置也會被訪問。比如順序執行代碼,或者使用一個數據結構? 時間局部性:被訪問過一次的存儲器位置,接下來會被多次引用。比如:循環? 緩存行(cache line)? 邏輯上的一組
    發表于 09-07 08:22

    什么是緩存Cache

    什么是緩存Cache 即高速緩沖存儲器,是位于CPU與主內存間的一種容量較小但速度很高的存儲器。由于CPU的速度遠高于主內存,CPU直接
    發表于 01-23 10:57 ?909次閱讀

    什么是Cache

    什么是Cache  英文縮寫: Cache 中文譯名: 高速緩存器 分  類: IP與多媒體 解  釋: 信息在本地的臨時存儲
    發表于 02-22 17:26 ?1030次閱讀

    高速緩存(Cache),高速緩存(Cache)原理是什么?

    高速緩存(Cache),高速緩存(Cache)原理是什么? 高速緩存Cache是位于CPU和主
    發表于 03-26 10:49 ?6853次閱讀

    Spring應用 1 springXML配置說明

    Spring應用 1 springXML配置說明 隱式對Spring容器注冊Process ? context:annotation-config / 為了在spring開發過程中,為
    發表于 01-13 12:20 ?399次閱讀

    二級緩存的簡單配置教程詳解 淺談二級緩存之功效

    緩存是指可以進行高速數據交換的存儲器,它先于內存與CPU交換數據,因此速度很快。L1Cache(一級緩存)是CPU第一層高速緩存。
    發表于 08-14 15:28 ?4326次閱讀
    二級<b class='flag-5'>緩存</b>的簡單<b class='flag-5'>配置</b>教程詳解 淺談二級<b class='flag-5'>緩存</b>之功效

    Linux內核Page Cache和Buffer Cache兩類緩存的作用及關系如何

    page)即為頁緩存(page cache)。塊緩存(buffer cache),則是內核為了加速對底層存儲介質的訪問速度,而構建的一層緩存
    的頭像 發表于 07-02 14:25 ?2807次閱讀
    Linux內核Page <b class='flag-5'>Cache</b>和Buffer <b class='flag-5'>Cache</b>兩類<b class='flag-5'>緩存</b>的作用及關系如何

    AMD 3D V-cache有望改變緩存設計

    在我們談論 3D V-Cache 之前,我們需要先談談常規的舊緩存。很久以前,計算機使用兩種基本類型的存儲:硬盤驅動器和隨機存取存儲器 (RAM)。硬盤驅動器速度慢但可以存儲大量數據,而 RAM 只能存儲少量數據但速度非???。
    發表于 02-13 15:58 ?674次閱讀

    使用Spring Cache實現緩存

    在學習Spring Cache之前,筆者經常會硬編碼的方式使用緩存。
    的頭像 發表于 05-11 17:40 ?818次閱讀
    使用<b class='flag-5'>Spring</b> <b class='flag-5'>Cache</b>實現<b class='flag-5'>緩存</b>

    什么是緩存(Cache)及其作用

    緩存Cache)是一種高速存儲器,用于臨時存儲數據,以便快速訪問。在計算機系統中,緩存的作用是減少處理器訪問主存儲器(如隨機存取存儲器RAM)所需的時間。 緩存
    的頭像 發表于 12-18 09:28 ?1296次閱讀
    主站蜘蛛池模板: 久久99精品AV99果冻 | 97视频免费在线观看 | 久久精品亚洲热综合一本 | 麻豆最新免费版 | yellow日本动漫免费观看 | 国产精品观看视频免费完整版 | 精品国产原创在线观看视频 | 99久久精品免费看国产一区二区三区 | 人妻少妇69式99偷拍 | 午夜视频体内射.COM.COM | 欧美亚洲另类丝袜自拍动漫 | 尤物国产在线精品三区 | 国语自产拍在线视频普通话 | 伊人久久电影网 | 肉小说高h | 午夜影院和视费x看 | 四虎永久在线精品国产 | 黄图gif揉胸吸奶 | 亚洲中文在线偷拍 | 亚洲欧美自拍明星换脸 | 果冻传媒在线看免费高清 | 免费果冻传媒2021在线观看 | 波多野结衣二区 | 国产色播视频在线观看 | 嫩草影院在线观看网站成人 | 丝袜诱惑qvod | 爱情岛论坛免费在线观看 | 日本高清免费在线 | 国产成人精品免费视频下载 | 快播电影网址 | 亚洲国产果果在线播放在线 | 特级毛片内射WWW无码 | 香蕉97超级碰碰碰碰碰久 | 国产亚洲精品精品精品 | adc免费观看| 回复术士人生重启在线观看 | 一级性生活毛片 | 久久精品手机观看 | 伸进同桌奶罩里摸她胸作文 | 免费毛片视频网站 | 超碰97超碰在线视频哦 |