SpringCache緩存框架概述
一、 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)文章希望大家以后多多支持腳本之家!
- Spring Boot 緩存注解@Cacheable、@CachePut、@CacheEvict超詳細(xì)實(shí)戰(zhàn)
- SpringBoot緩存抽象@Cacheable與緩存管理器配置方法
- SpringBoot使用Cache集成Redis做緩存的保姆級(jí)教程
- 使用Spring Cache時(shí)設(shè)置緩存鍵的注意事項(xiàng)詳解
- Java實(shí)現(xiàn)本地緩存的四種方案(Guava Cache、Caffeine、Ehcach 和Spring Cache)
- Spring Cache實(shí)現(xiàn)緩存技術(shù)
- SpringBoot集成Redis使用Cache緩存的實(shí)現(xiàn)方法
相關(guān)文章
關(guān)于SpringSecurity認(rèn)證邏輯源碼分析
這篇文章主要介紹了關(guān)于SpringSecurity認(rèn)證邏輯源碼分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Spring中EnvironmentAware 接口的使用小結(jié)
EnvironmentAware 是 Spring 框架中的一個(gè) Aware 回調(diào)接口,本文就來(lái)詳細(xì)的介紹一下Spring中EnvironmentAware 接口的使用小結(jié),感興趣的可以了解一下2026-04-04
詳解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)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
java簡(jiǎn)單實(shí)現(xiàn)八叉樹圖像處理代碼示例
這篇文章主要介紹了java簡(jiǎn)單實(shí)現(xiàn)八叉樹圖像處理代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12
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)方法
學(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打包不打包配置文件,配置文件為外部配置文件使用詳解
在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

