在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Spring Cache緩存常規(guī)配置

jf_ro2CN3Fa ? 來(lái)源:waynblog ? 2023-11-28 10:44 ? 次閱讀

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

Spring 緩存常規(guī)配置

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

按照 Spring Cache 框架給我們提供的 RedisCacheManager 實(shí)現(xiàn),只能在全局設(shè)置緩存有效期。這里給大家看一個(gè)常規(guī)的 CacheConfig 緩存配置類(lèi),代碼如下,

@EnableCaching
@Configuration
publicclassCacheConfigextendsCachingConfigurerSupport{
...

privateRedisSerializerkeySerializer(){
returnnewStringRedisSerializer();
}

privateRedisSerializervalueSerializer(){
returnnewGenericFastJsonRedisSerializer();
}

publicstaticfinalStringCACHE_PREFIX="crowd:";

@Bean
publicCacheManagercacheManager(RedisConnectionFactoryredisConnectionFactory){
//配置序列化(解決亂碼的問(wèn)題)
RedisCacheConfigurationconfig=RedisCacheConfiguration.defaultCacheConfig()
//設(shè)置key為String
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))
//設(shè)置value為自動(dòng)轉(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);
}
}

這里面簡(jiǎn)單對(duì) RedisCacheConfiguration 緩存配置做一下說(shuō)明:

serializeKeysWith():設(shè)置 Redis 的 key 的序列化規(guī)則。

erializeValuesWith():設(shè)置 Redis 的 value 的序列化規(guī)則。

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

entryTtl():全局設(shè)置 @Cacheable 注解緩存的有效期。

那么使用如上配置生成的 Redis 緩存 key 名稱(chēng)是什么樣得嘞?這里用開(kāi)源項(xiàng)目 crowd-admin 的 ConfigServiceImpl 類(lèi)下 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 名稱(chēng)如下,

crowdgetValueByKey_sys.name

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

TTL 過(guò)期時(shí)間是 287,跟我們?nèi)衷O(shè)置的 300 秒基本是一致的。此時(shí)假如我們想把 getValueByKey 方法的緩存有效期單獨(dú)設(shè)置為 600 秒,那我們?cè)撊绾尾僮鬣希?/p>

@Cacheable 注解默認(rèn)是沒(méi)有提供有關(guān)緩存有效期設(shè)置的。想要單獨(dú)修改 getValueByKey 方法的緩存有效期只能修改全局的緩存有效期。那么有沒(méi)有別的方法能夠?yàn)?getValueByKey 方法單獨(dú)設(shè)置緩存有效期嘞?當(dāng)然是有的,大家請(qǐng)往下看。

自定義 MyRedisCacheManager 緩存

其實(shí)我們可以通過(guò)自定義 MyRedisCacheManager 類(lèi)繼承 Spring Cache 提供的 RedisCacheManager 類(lèi)后,重寫(xiě) 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屬性用以單獨(dú)設(shè)置有效期
if(array.length>1){
longttl=Long.parseLong(array[1]);
cacheConfig=cacheConfig.entryTtl(Duration.ofSeconds(ttl));
}
returnsuper.createRedisCache(name,cacheConfig);
}
}

MyRedisCacheManager 類(lèi)邏輯如下,

繼承 Spring Cache 提供的 RedisCacheManager 類(lèi)。

重寫(xiě) createRedisCache(String name, RedisCacheConfiguration cacheConfig) 方法。

解析 name 參數(shù),根據(jù) # 字符串進(jìn)行分割,獲取緩存 key 名稱(chēng)以及緩存有效期。

接著我們修改下 CacheConfig 類(lèi)的 cacheManager 方法用以使用 MyRedisCacheManager 類(lèi)。代碼如下,

@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,單獨(dú)標(biāo)識(shí)緩存有效期。代碼如下,

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

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

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

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






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Cache
    +關(guān)注

    關(guān)注

    0

    文章

    129

    瀏覽量

    28433
  • 緩存器
    +關(guān)注

    關(guān)注

    0

    文章

    63

    瀏覽量

    11692
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    378

    瀏覽量

    10943

原文標(biāo)題:Spring Cache 緩存注解這樣用,實(shí)在是太香了!

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

    我們介紹`CPU Cache`的組織架構(gòu)及其進(jìn)行**讀操作**時(shí)的尋址方式,但是緩存不僅僅只有讀操作,還有 **寫(xiě)操作** ,這會(huì)帶來(lái)一個(gè)新的問(wèn)題
    的頭像 發(fā)表于 12-04 15:05 ?1718次閱讀
    CPU <b class='flag-5'>Cache</b>是如何保證<b class='flag-5'>緩存</b>一致性的?

    基于javaPoet的緩存key優(yōu)化實(shí)踐

    作者:京東物流 方志民 一. 背景 在一次系統(tǒng)opsreview中,發(fā)現(xiàn)了一些服務(wù)配置了@Cacheable注解。@cacheable 來(lái)源于spring cache框架中,作用是使用aop的方式將
    的頭像 發(fā)表于 01-14 15:18 ?521次閱讀
    基于javaPoet的<b class='flag-5'>緩存</b>key優(yōu)化實(shí)踐

    阿里巴巴開(kāi)源的通用緩存訪問(wèn)框架JetCache介紹

    摘要: JetCache是由阿里巴巴開(kāi)源的通用緩存訪問(wèn)框架,如果你對(duì)Spring Cache很熟悉的話(huà),請(qǐng)一定花一點(diǎn)時(shí)間了解一下JetCache,它更好用。JetCache可以做類(lèi)似Sprin
    發(fā)表于 04-24 16:09

    L2 Cache配置方案那種更好?

    對(duì)于其它外設(shè)不會(huì)修改,即只有CPU進(jìn)行讀寫(xiě)的數(shù)據(jù),有兩種配置方案:1.將L2 Cache配置為SRAM,數(shù)據(jù)存于L2 Cache,即數(shù)據(jù)直接放置于L2
    發(fā)表于 08-05 14:50

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

    存儲(chǔ)器系統(tǒng)的層次架構(gòu)是如何構(gòu)成的?高速緩存(cache)的工作原理是什么?高速緩存可分為哪幾類(lèi)?
    發(fā)表于 12-23 06:18

    高速緩存Cache介紹

    被訪問(wèn),那么將來(lái)它附近的位置也會(huì)被訪問(wèn)。比如順序執(zhí)行代碼,或者使用一個(gè)數(shù)據(jù)結(jié)構(gòu)? 時(shí)間局部性:被訪問(wèn)過(guò)一次的存儲(chǔ)器位置,接下來(lái)會(huì)被多次引用。比如:循環(huán)? 緩存行(cache line)? 邏輯上的一組
    發(fā)表于 09-07 08:22

    什么是緩存Cache

    什么是緩存Cache 即高速緩沖存儲(chǔ)器,是位于CPU與主內(nèi)存間的一種容量較小但速度很高的存儲(chǔ)器。由于CPU的速度遠(yuǎn)高于主內(nèi)存,CPU直接
    發(fā)表于 01-23 10:57 ?911次閱讀

    什么是Cache

    什么是Cache  英文縮寫(xiě): Cache 中文譯名: 高速緩存器 分  類(lèi): IP與多媒體 解  釋: 信息在本地的臨時(shí)存儲(chǔ)
    發(fā)表于 02-22 17:26 ?1032次閱讀

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

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

    Spring應(yīng)用 1 springXML配置說(shuō)明

    Spring應(yīng)用 1 springXML配置說(shuō)明 隱式對(duì)Spring容器注冊(cè)Process ? context:annotation-config / 為了在spring開(kāi)發(fā)過(guò)程中,為
    發(fā)表于 01-13 12:20 ?401次閱讀

    二級(jí)緩存的簡(jiǎn)單配置教程詳解 淺談二級(jí)緩存之功效

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

    Linux內(nèi)核Page Cache和Buffer Cache兩類(lèi)緩存的作用及關(guān)系如何

    page)即為頁(yè)緩存(page cache)。塊緩存(buffer cache),則是內(nèi)核為了加速對(duì)底層存儲(chǔ)介質(zhì)的訪問(wèn)速度,而構(gòu)建的一層緩存
    的頭像 發(fā)表于 07-02 14:25 ?2818次閱讀
    Linux內(nèi)核Page <b class='flag-5'>Cache</b>和Buffer <b class='flag-5'>Cache</b>兩類(lèi)<b class='flag-5'>緩存</b>的作用及關(guān)系如何

    AMD 3D V-cache有望改變緩存設(shè)計(jì)

    在我們談?wù)?3D V-Cache 之前,我們需要先談?wù)?b class='flag-5'>常規(guī)的舊緩存。很久以前,計(jì)算機(jī)使用兩種基本類(lèi)型的存儲(chǔ):硬盤(pán)驅(qū)動(dòng)器和隨機(jī)存取存儲(chǔ)器 (RAM)。硬盤(pán)驅(qū)動(dòng)器速度慢但可以存儲(chǔ)大量數(shù)據(jù),而 RAM 只能存儲(chǔ)少量數(shù)據(jù)但速度非常快。
    發(fā)表于 02-13 15:58 ?683次閱讀

    使用Spring Cache實(shí)現(xiàn)緩存

    在學(xué)習(xí)Spring Cache之前,筆者經(jīng)常會(huì)硬編碼的方式使用緩存
    的頭像 發(fā)表于 05-11 17:40 ?823次閱讀
    使用<b class='flag-5'>Spring</b> <b class='flag-5'>Cache</b>實(shí)現(xiàn)<b class='flag-5'>緩存</b>

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

    緩存Cache)是一種高速存儲(chǔ)器,用于臨時(shí)存儲(chǔ)數(shù)據(jù),以便快速訪問(wèn)。在計(jì)算機(jī)系統(tǒng)中,緩存的作用是減少處理器訪問(wèn)主存儲(chǔ)器(如隨機(jī)存取存儲(chǔ)器RAM)所需的時(shí)間。 緩存
    的頭像 發(fā)表于 12-18 09:28 ?1516次閱讀
    主站蜘蛛池模板: 男人的天堂在线精品视频 | 欧美深夜福利 | 天天免费看片 | 久久久久久久国产免费看 | 二级黄绝大片中国免费视频0 | 五月婷婷六月婷婷 | 亚洲综合春色另类久久 | 狠狠色噜噜狠狠狠狠狠色综合久久 | 美女被猛男躁免费视频网站 | 婷婷激情狠狠综合五月 | 夜夜操夜夜摸 | 天天射天天操天天干 | 久久黄色毛片 | 国产精品久久久久久久久免费 | 国产馆精品推荐在线观看 | 色777777女人色 | 四虎国产精品免费入口 | 在线视频影院 | 国产综合第一页在线视频 | 色屋在线 | 毛片毛多| 国产色啪午夜免费视频 | 澳门久久精品 | 黄色免费在线网站 | 日本不卡视频一区二区三区 | 五月天色婷婷丁香 | 井野雏田小樱天天被调教 | 大量喷潮free| 亚洲韩国日本欧美一区二区三区 | 中文字幕一区二区三区四区五区 | xxx性xxx| 不卡无毒免费毛片视频观看 | 久久国产成人精品国产成人亚洲 | 一级毛片ab片高清毛片 | 色综合精品 | 在线播放91灌醉迷j高跟美女 | 二区久久国产乱子伦免费精品 | 免费公开视频人人人人人人人 | 国产区精品高清在线观看 | 国产人成精品香港三级古代 | xxxxx日本69|