最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中的@Cacheable緩存注解詳解

 更新時(shí)間:2023年05月12日 11:30:28   作者:Java筆記蝦  
這篇文章主要介紹了Spring中的@Cacheable緩存注解詳解,數(shù)據(jù)庫(kù)查找的流程是先要從磁盤(pán)拿到數(shù)據(jù),再刷新到內(nèi)存,再返回?cái)?shù)據(jù)。磁盤(pán)相比于內(nèi)存來(lái)說(shuō),速度是很慢的,為了提升性能,就出現(xiàn)了基于內(nèi)存的緩存,需要的朋友可以參考下

1 什么是緩存

第一個(gè)問(wèn)題,首先要搞明白什么是緩存,緩存的意義是什么。

對(duì)于普通業(yè)務(wù),如果要查詢(xún)一個(gè)數(shù)據(jù),一般直接select數(shù)據(jù)庫(kù)進(jìn)行查找。但是在高流量的情況下,直接查找數(shù)據(jù)庫(kù)就會(huì)成為性能的瓶頸。因?yàn)閿?shù)據(jù)庫(kù)查找的流程是先要從磁盤(pán)拿到數(shù)據(jù),再刷新到內(nèi)存,再返回?cái)?shù)據(jù)。磁盤(pán)相比于內(nèi)存來(lái)說(shuō),速度是很慢的,為了提升性能,就出現(xiàn)了基于內(nèi)存的緩存。

這種基于內(nèi)存的緩存,由于無(wú)法跟磁盤(pán)頻繁進(jìn)行存儲(chǔ),所以無(wú)法保證數(shù)據(jù)的完整性,隨時(shí)有可能丟失,所以架構(gòu)一般使用數(shù)據(jù)庫(kù)加緩存的方式,數(shù)據(jù)庫(kù)用來(lái)持久化數(shù)據(jù),緩存用來(lái)處理大流量。

2 本地緩存和集中式緩存

緩存按照存儲(chǔ)方式可以分為這本地緩存和集中式緩存。

本地緩存顧名思義就是存儲(chǔ)在本地上,例如靜態(tài)變量就可以說(shuō)是一種本地緩存,存儲(chǔ)在了JVM中,或者說(shuō)自己本地搭建的項(xiàng)目用的redis也算是本地緩存,因?yàn)榫彺婧蛻?yīng)用都在一臺(tái)機(jī)器上。

本地緩存效率很高,直接讀取內(nèi)存,沒(méi)有網(wǎng)絡(luò)延遲,但是可用性很低,因?yàn)槌霈F(xiàn)單點(diǎn)故障的話(huà),數(shù)據(jù)庫(kù)和系統(tǒng)都會(huì)宕機(jī)。

對(duì)于大型項(xiàng)目來(lái)說(shuō),都會(huì)有集中式緩存,例如redis集群。緩存和應(yīng)用服務(wù)器是分離的,服務(wù)器需要通過(guò)網(wǎng)絡(luò)請(qǐng)求從緩存獲取數(shù)據(jù),一般應(yīng)用服務(wù)器也會(huì)采取集群的方式,這樣可以保證高可用,數(shù)據(jù)不易丟失,而且也能保證各個(gè)服務(wù)器的緩存數(shù)據(jù)一致。

對(duì)于分布式應(yīng)用來(lái)說(shuō),本地緩存還會(huì)出現(xiàn)緩存不一致的問(wèn)題,因?yàn)槊總€(gè)服務(wù)器的本地緩存都是獨(dú)立的。

3 本地緩存的優(yōu)點(diǎn)

剛才說(shuō)了這么多本地緩存的缺點(diǎn),那為什么還要用呢?

因?yàn)槿绻挤旁诩惺骄彺嬷?,網(wǎng)絡(luò)延遲會(huì)成為性能的瓶頸。因?yàn)椴辉诒镜貎?nèi)存,讀取的時(shí)間需要加上網(wǎng)絡(luò)通信的時(shí)間。所以在對(duì)性能要求更大或者緩存內(nèi)容不需要持久化、不需要一致性的情況下,本地緩存更適合。

所以一般的大型項(xiàng)目都采用本地緩存和集中式緩存混合使用的方式。

4 Spring對(duì)于緩存的支持

終于說(shuō)到正題,本地緩存可以通過(guò)spring更簡(jiǎn)單的管理和使用。

springboot和springmvc都支持緩存,其中CacheManager是Spring提供的緩存接口。

4.1 spring支持的CacheManager

60d4849a0ea96abea563dcb8af30ff6d.png

看著非常多,實(shí)際上正常用的只有ConcurrentMapCacheManager,EhCacheCacheManager,GuavaCacheManager(一般使用redis,我們需要更靈活的對(duì)redis鍵值進(jìn)行操作,所以不用RedisCacheManager),我們重點(diǎn)去講一下這個(gè)GuavaCacheManager。

4.2 GuavaCache

Guava是谷歌開(kāi)源的Java庫(kù),其中的代表就有這個(gè)緩存。

GuavaCache的原理大概是LRU+ConcurrentHashMap,加載在JVM的本地緩存

4.3 引入依賴(lài)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
<dependency>
     <groupId>com.google.guava</groupId>
     <artifactId>guava</artifactId>
     <version>18.0</version>
</dependency>
//有可能需要這個(gè)
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.2.5.RELEASE</version>
</dependency>

4.4 創(chuàng)建配置類(lèi)

@EnableCaching
@Configuration
public class GuavaCacheConfig {
    @Bean
    public CacheManager cacheManager() {
        GuavaCacheManager cacheManager = new GuavaCacheManager();
        cacheManager.setCacheBuilder(
                CacheBuilder.newBuilder().
                        expireAfterWrite(3, TimeUnit.MINUTES));
        return cacheManager;
    }
}

@EnableCaching用來(lái)開(kāi)啟注解功能,這里設(shè)置的失效時(shí)間是3分鐘。

Guava Cache 除了代碼中提到的設(shè)置緩存過(guò)期時(shí)間的策略外,還有其他的策略。下面是 Guava Cache 設(shè)置緩存過(guò)期時(shí)間的策略:

  • expireAfterAccess: 當(dāng)緩存項(xiàng)在指定的時(shí)間段內(nèi)沒(méi)有被讀或?qū)懢蜁?huì)被回收。
  • expireAfterWrite:當(dāng)緩存項(xiàng)在指定的時(shí)間段內(nèi)沒(méi)有更新就會(huì)被回收,如果我們認(rèn)為緩存數(shù)據(jù)在一段時(shí)間后數(shù)據(jù)不再可用,那么可以使用該種策略。
  • refreshAfterWrite:當(dāng)緩存項(xiàng)上一次更新操作之后的多久會(huì)被刷新。

4.5 緩存注解

標(biāo)題終于出現(xiàn)了

991c3395fd30d45f43b2310f82215227.png

我這里就主要解釋下@Cacheable的用法,因?yàn)檫@個(gè)比較常見(jiàn)(其他的我也沒(méi)用過(guò))

4.6 @Cacheable的用法

常用參數(shù)有

d66e8edcf27e46adff27469f2bc76392.png

#代表的是EL表達(dá)式

這里的key和value和我們以為的緩存鍵值對(duì)是不一樣的

value+key 只是我們緩存鍵的名字,真正的值是方法的返回值。

舉一個(gè)例子

@Cacheable(value = "olympic_match_new_action",key = "'get_relate_news_'+#rsc")
 public List<MatchNewsVO> getRelateNews(String rsc){
        ....       
 }

一般value取service名,key取方法名,取名按照數(shù)據(jù)庫(kù)的下劃線(xiàn)方式。后面那個(gè)#rsc指的是傳進(jìn)來(lái)的參數(shù),這些都是鍵。返回的List就是緩存的值。

5 @Cacheable失效的原因

在配置正常的情況下,本人親歷的失效原因就是一個(gè)類(lèi)的方法調(diào)用了帶有緩存的方法,結(jié)果緩存失效。

我使用service的A方法,想調(diào)用這個(gè)service的緩存B方法,這樣是不行的。

原因是@Cacheable是由AOP代理實(shí)現(xiàn),生成了帶有緩存的代理類(lèi)。其他類(lèi)想調(diào)用這個(gè)類(lèi)的緩存方法時(shí),會(huì)去調(diào)用這個(gè)代理類(lèi)的方法,實(shí)現(xiàn)緩存功能。但是類(lèi)內(nèi)部調(diào)用這個(gè)方法,就不會(huì)去調(diào)用代理類(lèi)的方法,導(dǎo)致緩存失效

到此這篇關(guān)于Spring中的@Cacheable緩存注解詳解的文章就介紹到這了,更多相關(guān)Spring @Cacheable緩存注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 談?wù)凧ava中自定義注解及使用場(chǎng)景

    談?wù)凧ava中自定義注解及使用場(chǎng)景

    這篇文章主要介紹了談?wù)凧ava中自定義注解及使用場(chǎng)景,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 解讀easyexcel中的常用注解

    解讀easyexcel中的常用注解

    這篇文章主要介紹了關(guān)于easyexcel中的常用注解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Java實(shí)現(xiàn)優(yōu)雅的參數(shù)校驗(yàn)方法詳解

    Java實(shí)現(xiàn)優(yōu)雅的參數(shù)校驗(yàn)方法詳解

    這篇文章主要為大家詳細(xì)介紹了Java語(yǔ)言如何實(shí)現(xiàn)優(yōu)雅的參數(shù)校驗(yàn),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定是幫助,需要的可以參考一下
    2022-06-06
  • java8 Stream API之reduce使用說(shuō)明

    java8 Stream API之reduce使用說(shuō)明

    這篇文章主要介紹了java8 Stream API之reduce使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • Mybatis關(guān)聯(lián)查詢(xún)遇到的坑-無(wú)主鍵的關(guān)聯(lián)數(shù)據(jù)去重問(wèn)題

    Mybatis關(guān)聯(lián)查詢(xún)遇到的坑-無(wú)主鍵的關(guān)聯(lián)數(shù)據(jù)去重問(wèn)題

    這篇文章主要介紹了Mybatis關(guān)聯(lián)查詢(xún)遇到的坑-無(wú)主鍵的關(guān)聯(lián)數(shù)據(jù)去重問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java tomcat中的類(lèi)加載器和安全機(jī)制你了解嗎

    Java tomcat中的類(lèi)加載器和安全機(jī)制你了解嗎

    這篇文章主要介紹了Tomcat 類(lèi)加載器的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下,希望能夠給你帶來(lái)幫助
    2021-09-09
  • RocketMQ事務(wù)消息圖文示例講解

    RocketMQ事務(wù)消息圖文示例講解

    RocketMQ事務(wù)消息(Transactional Message)是指應(yīng)用本地事務(wù)和發(fā)送消息操作可以被定義到全局事務(wù)中,要么同時(shí)成功,要么同時(shí)失敗。RocketMQ的事務(wù)消息提供類(lèi)似 X/Open XA 的分布式事務(wù)功能,通過(guò)事務(wù)消息能達(dá)到分布式事務(wù)的最終一致
    2022-12-12
  • Java整合mybatis實(shí)現(xiàn)過(guò)濾數(shù)據(jù)

    Java整合mybatis實(shí)現(xiàn)過(guò)濾數(shù)據(jù)

    這篇文章主要介紹了Java整合mybatis實(shí)現(xiàn)過(guò)濾數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-01-01
  • Spring Boot 2結(jié)合Spring security + JWT實(shí)現(xiàn)微信小程序登錄

    Spring Boot 2結(jié)合Spring security + JWT實(shí)現(xiàn)微信小程序登錄

    這篇文章主要介紹了Spring Boot 2結(jié)合Spring security + JWT實(shí)現(xiàn)微信小程序登錄,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Java的分片上傳功能的實(shí)現(xiàn)

    Java的分片上傳功能的實(shí)現(xiàn)

    本文主要介紹了Java的分片上傳功能的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02

最新評(píng)論

报价| 赣州市| 安龙县| 南漳县| 通渭县| 津南区| 旬邑县| 富民县| 大化| 阳原县| 民乐县| 五台县| 仁化县| 荔浦县| 贡觉县| 远安县| 肥乡县| 建德市| 蓝田县| 达州市| 锦屏县| 阜新| 恩施市| 重庆市| 慈溪市| 栾川县| 沾益县| 铜川市| 甘谷县| 昌平区| 江门市| 青阳县| 绵竹市| 永德县| 玉树县| 惠州市| 邵东县| 汨罗市| 黄平县| 连云港市| 嵊泗县|