SpringCache緩存框架概述
一、 SpringCache緩存介紹
Spring Cache是一個框架,實現(xiàn)了基于注解的緩存功能,只需要簡單地加一個注解,就能實現(xiàn)緩存功能,大大簡化我們在業(yè)務中操作緩存的代碼。
Spring Cache只是提供了一層抽象,底層可以切換不同的cache實現(xiàn)。具體就是通過CacheManager接口來統(tǒng)一不同的緩存技術。CacheManager是Spring提供的各種緩存技術抽象接口。
針對不同的緩存技術需要實現(xiàn)不同的CacheManager:
CacheManager 描述
EhCacheCacheManager 使用EhCache作為緩存技術
GuavaCacheManager 使用Google的GuavaCache作為緩存技術
RedisCacheManager 使用Redis作為緩存技術
二、 SpringCache注解
在SpringCache中提供了很多緩存操作的注解,常見的是以下的幾個:
注解 說明
@EnableCaching 開啟緩存注解功能
@Cacheable 在方法執(zhí)行前spring先查看緩存中是否有數(shù)據(jù),如果有數(shù)據(jù),則直接返回緩存數(shù)據(jù);若沒有數(shù)據(jù),調(diào)用方法并將方法返回值放到緩存中
@CachePut 將方法的返回值放到緩存中
@CacheEvict 將一條或多條數(shù)據(jù)從緩存中刪除
2.1 @CachePut注解
@CachePut 說明:
? 作用: 將方法返回值,放入緩存
? value: 緩存的名稱, 每個緩存名稱下面可以有很多key
? key: 緩存的key ----------> 支持Spring的表達式語言SPEL語法
使用示例:在save方法上加注解@CachePut。當前UserController的save方法是用來保存用戶信息的,我們希望在該用戶信息保存到數(shù)據(jù)庫的同時,也往緩存中緩存一份數(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代表方法返回值,該表達式 代表以返回對象的id屬性作為key ;
? #result.name : #result代表方法返回值,該表達式 代表以返回對象的name屬性作為key ;
2.2 @CacheEvict注解
@CacheEvict 說明:
? 作用: 清理指定緩存
? value: 緩存的名稱,每個緩存名稱下面可以有多個key
? key: 緩存的key ----------> 支持Spring的表達式語言SPEL語法
使用示例: 在 delete 方法上加注解@CacheEvict。當我們在刪除數(shù)據(jù)庫user表的數(shù)據(jù)的時候,我們需要刪除緩存中對應的數(shù)據(jù),此時就可以使用@CacheEvict注解, 具體的使用方式如下:
@CacheEvict(value = "userCache",key = "#p0") //#p0 代表第一個參數(shù)
//@CacheEvict(value = "userCache",key = "#id") //#id 代表變量名為id的參數(shù)
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id){
userService.removeById(id);
}2.3 @Cacheable注解
@Cacheable 說明:
? 作用: 在方法執(zhí)行前,spring先查看緩存中是否有數(shù)據(jù),如果有數(shù)據(jù),則直接返回緩存數(shù)據(jù);若沒有數(shù)據(jù),調(diào)用方法并將方法返回值放到緩存中
? value: 緩存的名稱,每個緩存名稱下面可以有多個key
? key: 緩存的key ----------> 支持Spring的表達式語言SPEL語法
使用情況1:在getById上加注解@Cacheable
@Cacheable(value = "userCache",key = "#id")
@GetMapping("/{id}")
public User getById(@PathVariable Long id){
User user = userService.getById(id);
return user;
}當我們在測試時,查詢一個數(shù)據(jù)庫不存在的id值,第一次查詢緩存中沒有,也會查詢數(shù)據(jù)庫。而第二次再查詢時,會發(fā)現(xiàn),不再查詢數(shù)據(jù)庫了,而是直接返回,那也就是說如果根據(jù)ID沒有查詢到數(shù)據(jù),那么會自動緩存一個null值。
我們能不能做到,當查詢到的值不為null時,再進行緩存,如果為null,則不緩存呢? 答案是可以的。
使用情況2: 緩存非null值。
在@Cacheable注解中,提供了兩個屬性分別為: condition, unless 。
condition : 表示滿足條件時才緩存數(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;
}注意: 此處,我們使用的時候只能夠使用 unless, 因為在condition中,我們是無法獲取到結果 #result的。
使用情況3: 在list方法上加注解@Cacheable。
在list方法中進行查詢時,有兩個查詢條件,如果傳遞了id,根據(jù)id查詢; 如果傳遞了name, 根據(jù)name查詢,那么我們緩存的key在設計的時候,就需要既包含id,又包含name。 具體的代碼實現(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;
}到此這篇關于SpringCache緩存的文章就介紹到這了,更多相關SpringCache緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決springboot自定義注解AOP在controller上導致controller注入失敗問題
這篇文章主要介紹了解決springboot自定義注解AOP在controller上導致controller注入失敗問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10
java String[]字符串數(shù)組自動排序的簡單實現(xiàn)
下面小編就為大家?guī)硪黄猨ava String[]字符串數(shù)組自動排序的簡單實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09
Spring Boot啟動時調(diào)用自己的非web邏輯
在spring Boot中,有些代碼是WEB功能,例如API等,但是有些邏輯是非WEB,啟動時就要調(diào)用并持續(xù)運行的,該如何加載自己的非WEB邏輯呢,下面通過實例代碼給大家講解,一起看看吧2017-07-07
SpringBoot獲取前臺參數(shù)的六種方式以及統(tǒng)一響應
本文主要介紹了SpringBoot獲取前臺參數(shù)的六種方式以及統(tǒng)一響應,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-03-03

