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

SpringCache緩存框架概述

 更新時(shí)間:2025年11月21日 08:48:50   作者:努力--堅(jiān)持  
本文介紹了SpringCache緩存框架,包括其基本概念、CacheManager接口以及常用的注解如@Cacheable、@CachePut和@CacheEvict,通過(guò)這些注解,可以方便地在方法中實(shí)現(xiàn)緩存操作,提高應(yīng)用性能,感興趣的朋友跟隨小編一起看看吧

一、 SpringCache緩存介紹

Spring Cache是一個(gè)框架,實(shí)現(xiàn)了基于注解的緩存功能,只需要簡(jiǎn)單地加一個(gè)注解,就能實(shí)現(xiàn)緩存功能,大大簡(jiǎn)化我們?cè)跇I(yè)務(wù)中操作緩存的代碼。

  Spring Cache只是提供了一層抽象,底層可以切換不同的cache實(shí)現(xiàn)。具體就是通過(guò)CacheManager接口來(lái)統(tǒng)一不同的緩存技術(shù)。CacheManager是Spring提供的各種緩存技術(shù)抽象接口。

  針對(duì)不同的緩存技術(shù)需要實(shí)現(xiàn)不同的CacheManager:

  CacheManager 描述
  EhCacheCacheManager 使用EhCache作為緩存技術(shù)
  GuavaCacheManager 使用Google的GuavaCache作為緩存技術(shù)
  RedisCacheManager 使用Redis作為緩存技術(shù)

二、 SpringCache注解

在SpringCache中提供了很多緩存操作的注解,常見的是以下的幾個(gè):

  注解 說(shuō)明
  @EnableCaching 開啟緩存注解功能
  @Cacheable 在方法執(zhí)行前spring先查看緩存中是否有數(shù)據(jù),如果有數(shù)據(jù),則直接返回緩存數(shù)據(jù);若沒(méi)有數(shù)據(jù),調(diào)用方法并將方法返回值放到緩存中
  @CachePut 將方法的返回值放到緩存中
  @CacheEvict 將一條或多條數(shù)據(jù)從緩存中刪除

2.1 @CachePut注解

@CachePut 說(shuō)明:

  ? 作用: 將方法返回值,放入緩存

?   value: 緩存的名稱, 每個(gè)緩存名稱下面可以有很多key

  ? key: 緩存的key ----------> 支持Spring的表達(dá)式語(yǔ)言SPEL語(yǔ)法

使用示例:在save方法上加注解@CachePut。當(dāng)前UserController的save方法是用來(lái)保存用戶信息的,我們希望在該用戶信息保存到數(shù)據(jù)庫(kù)的同時(shí),也往緩存中緩存一份數(shù)據(jù),我們可以在save方法上加上注解 @CachePut,用法如下:

@CachePut(value = "userCache", key = "#user.id")
@PostMapping
public User save(User user){
    userService.save(user);
    return user;
}

key的寫法如下:

?   #user.id : #user指的是方法形參的名稱, id指的是user的id屬性 , 也就是使用user的id屬性作為key ;

?   #user.name: #user指的是方法形參的名稱, name指的是user的name屬性 ,也就是使用user的name屬性作為key ;

?   #result.id : #result代表方法返回值,該表達(dá)式 代表以返回對(duì)象的id屬性作為key ;

  ? #result.name : #result代表方法返回值,該表達(dá)式 代表以返回對(duì)象的name屬性作為key ;

2.2 @CacheEvict注解

@CacheEvict 說(shuō)明:

?   作用: 清理指定緩存

?   value: 緩存的名稱,每個(gè)緩存名稱下面可以有多個(gè)key

?   key: 緩存的key ----------> 支持Spring的表達(dá)式語(yǔ)言SPEL語(yǔ)法

使用示例: 在 delete 方法上加注解@CacheEvict。當(dāng)我們?cè)趧h除數(shù)據(jù)庫(kù)user表的數(shù)據(jù)的時(shí)候,我們需要?jiǎng)h除緩存中對(duì)應(yīng)的數(shù)據(jù),此時(shí)就可以使用@CacheEvict注解, 具體的使用方式如下:

@CacheEvict(value = "userCache",key = "#p0")  //#p0 代表第一個(gè)參數(shù)
//@CacheEvict(value = "userCache",key = "#id") //#id 代表變量名為id的參數(shù)
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id){
    userService.removeById(id);
}

2.3 @Cacheable注解


@Cacheable 說(shuō)明:

?   作用: 在方法執(zhí)行前,spring先查看緩存中是否有數(shù)據(jù),如果有數(shù)據(jù),則直接返回緩存數(shù)據(jù);若沒(méi)有數(shù)據(jù),調(diào)用方法并將方法返回值放到緩存中

?   value: 緩存的名稱,每個(gè)緩存名稱下面可以有多個(gè)key

?   key: 緩存的key ----------> 支持Spring的表達(dá)式語(yǔ)言SPEL語(yǔ)法

使用情況1:在getById上加注解@Cacheable

@Cacheable(value = "userCache",key = "#id")
@GetMapping("/{id}")
public User getById(@PathVariable Long id){
    User user = userService.getById(id);
    return user;
}

當(dāng)我們?cè)跍y(cè)試時(shí),查詢一個(gè)數(shù)據(jù)庫(kù)不存在的id值,第一次查詢緩存中沒(méi)有,也會(huì)查詢數(shù)據(jù)庫(kù)。而第二次再查詢時(shí),會(huì)發(fā)現(xiàn),不再查詢數(shù)據(jù)庫(kù)了,而是直接返回,那也就是說(shuō)如果根據(jù)ID沒(méi)有查詢到數(shù)據(jù),那么會(huì)自動(dòng)緩存一個(gè)null值。

  我們能不能做到,當(dāng)查詢到的值不為null時(shí),再進(jìn)行緩存,如果為null,則不緩存呢? 答案是可以的。

  使用情況2: 緩存非null值。

  在@Cacheable注解中,提供了兩個(gè)屬性分別為: condition, unless 。

    condition : 表示滿足條件時(shí)才緩存數(shù)據(jù);

    unless : 表示滿足條件則不緩存 ; 與上述的condition是反向的 ;

@Cacheable(value = "userCache",key = "#id", unless = "#result == null")
@GetMapping("/{id}")
public User getById(@PathVariable Long id){
    User user = userService.getById(id);
    return user;
}

注意: 此處,我們使用的時(shí)候只能夠使用 unless, 因?yàn)樵赾ondition中,我們是無(wú)法獲取到結(jié)果 #result的。

  使用情況3: 在list方法上加注解@Cacheable。

  在list方法中進(jìn)行查詢時(shí),有兩個(gè)查詢條件,如果傳遞了id,根據(jù)id查詢; 如果傳遞了name, 根據(jù)name查詢,那么我們緩存的key在設(shè)計(jì)的時(shí)候,就需要既包含id,又包含name。 具體的代碼實(shí)現(xiàn)如下:

@Cacheable(value = "userCache",key = "#user.id + '_' + #user.name")
@GetMapping("/list")
public List<User> list(User user){
    LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(user.getId() != null,User::getId,user.getId());
    queryWrapper.eq(user.getName() != null,User::getName,user.getName());
    List<User> list = userService.list(queryWrapper);
    return list;
}

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

相關(guān)文章

  • 關(guān)于SpringSecurity認(rèn)證邏輯源碼分析

    關(guān)于SpringSecurity認(rèn)證邏輯源碼分析

    這篇文章主要介紹了關(guān)于SpringSecurity認(rèn)證邏輯源碼分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Spring中EnvironmentAware 接口的使用小結(jié)

    Spring中EnvironmentAware 接口的使用小結(jié)

    EnvironmentAware 是 Spring 框架中的一個(gè) Aware 回調(diào)接口,本文就來(lái)詳細(xì)的介紹一下Spring中EnvironmentAware 接口的使用小結(jié),感興趣的可以了解一下
    2026-04-04
  • 詳解SpringBoot啟動(dòng)類的掃描注解的用法及沖突原則

    詳解SpringBoot啟動(dòng)類的掃描注解的用法及沖突原則

    這篇文章主要介紹了詳解SpringBoot啟動(dòng)類的掃描注解的用法及沖突原則,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Spring Boot 單元測(cè)試和集成測(cè)試實(shí)現(xiàn)詳解

    Spring Boot 單元測(cè)試和集成測(cè)試實(shí)現(xiàn)詳解

    這篇文章主要介紹了Spring Boot 單元測(cè)試和集成測(cè)試實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 深入探究Java線程與進(jìn)程有哪些區(qū)別

    深入探究Java線程與進(jìn)程有哪些區(qū)別

    這篇文章主要介紹了Java并發(fā)編程之線程創(chuàng)建,進(jìn)程是代碼在數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,線程則是一個(gè)實(shí)體,一個(gè)進(jìn)程中至少有一個(gè)線程,下文更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-04-04
  • java簡(jiǎn)單實(shí)現(xiàn)八叉樹圖像處理代碼示例

    java簡(jiǎn)單實(shí)現(xiàn)八叉樹圖像處理代碼示例

    這篇文章主要介紹了java簡(jiǎn)單實(shí)現(xiàn)八叉樹圖像處理代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • SpringBoot解決跨域的五種方式

    SpringBoot解決跨域的五種方式

    在?Spring?Boot?中解決跨域(CORS,Cross-Origin?Resource?Sharing)問(wèn)題有?多種方式,適用于不同場(chǎng)景,下面系統(tǒng)地介紹?5?種主流方法,從簡(jiǎn)單到靈活,附代碼示例和適用場(chǎng)景,需要的朋友可以參考下
    2025-10-10
  • Java基于socket實(shí)現(xiàn)簡(jiǎn)易聊天室實(shí)例

    Java基于socket實(shí)現(xiàn)簡(jiǎn)易聊天室實(shí)例

    這篇文章主要介紹了Java基于socket實(shí)現(xiàn)簡(jiǎn)易聊天室的方法,實(shí)例分析了java基于socket實(shí)現(xiàn)聊天室服務(wù)端與客戶端的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • kotlin快速入門之標(biāo)準(zhǔn)函數(shù)與靜態(tài)方法

    kotlin快速入門之標(biāo)準(zhǔn)函數(shù)與靜態(tài)方法

    學(xué)完了Kotlin的基礎(chǔ)知識(shí),是時(shí)候來(lái)來(lái)學(xué)習(xí) Kotlin的標(biāo)準(zhǔn)函數(shù)和靜態(tài)方法了,下面這篇文章主要給大家介紹了關(guān)于kotlin快速入門之標(biāo)準(zhǔn)函數(shù)與靜態(tài)方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • 部署springboot打包不打包配置文件,配置文件為外部配置文件使用詳解

    部署springboot打包不打包配置文件,配置文件為外部配置文件使用詳解

    在Spring Boot項(xiàng)目中,將配置文件排除在jar包之外,通過(guò)外部配置文件來(lái)管理不同環(huán)境的配置,可以實(shí)現(xiàn)靈活的配置管理,在pom.xml文件中添加相關(guān)配置,打包時(shí)忽略指定文件,運(yùn)行時(shí)在jar包同級(jí)目錄下創(chuàng)建config文件夾,將配置文件放入其中即可
    2025-02-02

最新評(píng)論

绥滨县| 河间市| 邮箱| 郁南县| 德兴市| 朝阳县| 日土县| 西宁市| 汉中市| 成安县| 双鸭山市| 台安县| 沭阳县| 武宣县| 河津市| 运城市| 巴中市| 苍山县| 确山县| 太湖县| 奇台县| 灯塔市| 三江| 桂平市| 湟中县| 三门峡市| 抚顺市| 新密市| 宝山区| 桂林市| 巨鹿县| 灵寿县| 烟台市| 甘孜县| 克拉玛依市| 泸水县| 巨鹿县| 宁武县| 卢氏县| 崇信县| 河北省|