1.?介紹
Spring Cache 是一個框架,實現了基于注解的緩存功能,只需要簡單地加一個注解,就能實現緩存功能。
Spring Cache 提供了一層抽象,底層可以切換不同的緩存實現,例如:
-
EHCache
-
Caffeine
-
Redis(常用)
起步依賴:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId> <version>2.7.3</version>
</dependency>
1.1?常用注解
在SpringCache中提供了很多緩存操作的注解,常見的是以下的幾個:
注解 | 說明 |
---|---|
@EnableCaching | 開啟緩存注解功能,通常加在啟動類上 |
@Cacheable | 在方法執行前先查詢緩存中是否有數據,如果有數據,則直接返回緩存數據;如果沒有緩存數據,調用方法并將方法返回值放到緩存中 |
@CachePut | 將方法的返回值放到緩存中 |
@CacheEvict | 將一條或多條數據從緩存中刪除 |
在spring boot項目中,使用緩存技術只需在項目中導入相關緩存技術的依賴包,并在啟動類上使用@EnableCaching開啟緩存支持即可。
例如,使用Redis作為緩存技術,只需要導入Spring data Redis的maven坐標即可。
1.2?入門案例
1). 環境準備
導入基礎工程:底層已使用Redis緩存實現
基礎環境的代碼,在我們今天的資料中已經準備好了, 大家只需要將這個工程導入進來就可以了。導入進來的工程結構如下:
數據庫準備:
創建名為spring_cache_demo數據庫,將springcachedemo.sql腳本直接導入數據庫中。
引導類上加@EnableCaching:
package com.itheima;import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;@Slf4j
@SpringBootApplication
@EnableCaching//開啟緩存注解功能
public class CacheDemoApplication {public static void main(String[] args) {SpringApplication.run(CacheDemoApplication.class,args);log.info("項目啟動成功...");}
}
2). @CachePut注解
@CachePut 說明:
作用: 將方法返回值,放入緩存
value: 緩存的名稱, 每個緩存名稱下面可以有很多key
key: 緩存的key ----------> 支持Spring的表達式語言SPEL語法
在save方法上加注解@CachePut
當前UserController的save方法是用來保存用戶信息的,我們希望在該用戶信息保存到數據庫的同時,也往緩存中緩存一份數據,我們可以在save方法上加上注解 @CachePut,用法如下:
/*** CachePut:將方法返回值放入緩存* value:緩存的名稱,每個緩存名稱下面可以有多個key* key:緩存的key*/@PostMapping@CachePut(value = "userCache", key = "#user.id")//key的生成:userCache::1public User save(@RequestBody User user){userMapper.insert(user);return user;}
說明:key的寫法如下
#user.id : #user指的是方法形參的名稱, id指的是user的id屬性 , 也就是使用user的id屬性作為key ;
#result.id : #result代表方法返回值,該表達式 代表以返回對象的id屬性作為key ;
#p0.id:#p0指的是方法中的第一個參數,id指的是第一個參數的id屬性,也就是使用第一個參數的id屬性作為key ;
#a0.id:#a0指的是方法中的第一個參數,id指的是第一個參數的id屬性,也就是使用第一個參數的id屬性作為key ;
#root.args[0].id:#root.args[0]指的是方法中的第一個參數,id指的是第一個參數的id屬性,也就是使用第一個參數
的id屬性作為key ;
啟動服務,通過swagger接口文檔測試,訪問UserController的save()方法
因為id是自增,所以不需要設置id屬性
查看user表中的數據
查看Redis中的數據
3). @Cacheable注解
@Cacheable 說明:
作用: 在方法執行前,spring先查看緩存中是否有數據,如果有數據,則直接返回緩存數據;若沒有數據,調用方法并將方法返回值放到緩存中
value: 緩存的名稱,每個緩存名稱下面可以有多個key
key: 緩存的key ----------> 支持Spring的表達式語言SPEL語法
在getById上加注解@Cacheable
/*** Cacheable:在方法執行前spring先查看緩存中是否有數據,如果有數據,則直接返回緩存數據;若沒有數據, *調用方法并將方法返回值放到緩存中* value:緩存的名稱,每個緩存名稱下面可以有多個key* key:緩存的key*/@GetMapping@Cacheable(cacheNames = "userCache",key="#id")public User getById(Long id){User user = userMapper.getById(id);return user;}
重啟服務,通過swagger接口文檔測試,訪問UserController的getById()方法
第一次訪問,會請求我們controller的方法,查詢數據庫。后面再查詢相同的id,就直接從Redis中查詢數據,不用再查詢數據庫了,就說明緩存生效了。
提前在redis中手動刪除掉id=1的用戶數據
查看控制臺sql語句:說明從數據庫查詢的用戶數據
查看Redis中的緩存數據:說明已成功緩存
再次查詢相同id的數據時,直接從redis中直接獲取,不再查詢數據庫。
4). @CacheEvict注解
@CacheEvict 說明:
作用: 清理指定緩存
value: 緩存的名稱,每個緩存名稱下面可以有多個key
key: 緩存的key ----------> 支持Spring的表達式語言SPEL語法
在 delete 方法上加注解@CacheEvict
@DeleteMapping@CacheEvict(cacheNames = "userCache",key = "#id")//刪除某個key對應的緩存數據public void deleteById(Long id){userMapper.deleteById(id);}@DeleteMapping("/delAll")@CacheEvict(cacheNames = "userCache",allEntries = true)//刪除userCache下所有的緩存數據public void deleteAll(){userMapper.deleteAll();}
重啟服務,通過swagger接口文檔測試,訪問UserController的deleteAll()方法
查看user表:數據清空
查詢Redis緩存數據