SpringCache的基本使用方法
概述
常見的緩存的框架有Redis、Memcached、Guava、Caffeine等等, 各有各的優(yōu)勢(shì)。如果我們的程序想要使用緩存,就要與這些框架耦合。聰明的架構(gòu)師已經(jīng)在利用接口來降低耦合了,利用面向?qū)ο蟮某橄蠛投鄳B(tài)的特性,做到業(yè)務(wù)代碼與具體的框架分離。但我們?nèi)匀恍枰@式地在代碼中去調(diào)用與緩存有關(guān)的接口和方法,在合適的時(shí)候插入數(shù)據(jù)到緩存里,在合適的時(shí)候從緩存中讀取數(shù)據(jù)。
Spring Cache利用了AOP,實(shí)現(xiàn)了基于注解的緩存功能,并且進(jìn)行了合理的抽象,業(yè)務(wù)代碼不用關(guān)心底層是使用了什么緩存框架,只需要簡單地加一個(gè)注解,就能實(shí)現(xiàn)緩存功能了。而且Spring Cache也提供了很多默認(rèn)的配置,用戶可以3秒鐘就使用上一個(gè)很不錯(cuò)的緩存功能。
SpringCache使用
常用注解
| 注解 | 說明 |
|---|---|
| @EnableCaching | 開啟緩存注解功能,通常加在啟動(dòng)類上 |
| @Cacheable | 在方法執(zhí)行前先查詢緩存中是否有數(shù)據(jù),如果有數(shù)據(jù),則直接返回緩存數(shù)據(jù);如果沒有緩存數(shù)據(jù),調(diào)用方法并將方法返回值放到緩存中 |
| @CachePut | 將方法的返回值放到緩存中 |
| @CacheEvict | 將一條或多條數(shù)據(jù)從緩存中刪除 |
引入相關(guān)依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.3</version>
<relativePath/>
</parent>
<groupId>com.itheima</groupId>
<artifactId>springcache-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.3</version>
</plugin>
</plugins>
</build>
</project>使用步驟
配置文件
需要在配置文件中設(shè)置相關(guān)內(nèi)容,Redis地址、MySQL地址等,使用SpringCache可以將返回或者請(qǐng)求內(nèi)容自動(dòng)存入Redis
server:
port: 8888
spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://XXXX:3305/springcachedemo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: "02120212"
redis:
host: XXXX
port: 6378
password: "02120212"
database: 0
logging:
level:
com:
itheima:
mapper: debug
service: info
controller: info開始使用
1、開啟緩存
需要在啟動(dòng)類上加上@EnableCaching 注解

2、設(shè)置緩存
設(shè)置緩存使用@CachePut 注解。如果需要將請(qǐng)求的內(nèi)容放入緩存可以按照以下步驟實(shí)現(xiàn)。
設(shè)置鍵的格式為參數(shù)::參數(shù),由于在Redis中可以設(shè)置樹型結(jié)構(gòu)。
關(guān)于Redis樹型結(jié)構(gòu)
如果需要設(shè)置Redis樹型結(jié)構(gòu),可以設(shè)置鍵為
abc:bca:cba
這樣設(shè)置在Redis中展現(xiàn)就像是樹型,像是文件夾的目錄結(jié)構(gòu)。

適應(yīng)不同用戶的習(xí)慣,有多種方式獲取參數(shù),這里的cacheNames設(shè)置是
// TODO 2. 設(shè)置緩存數(shù)據(jù)值
@CachePut(cacheNames = "userCache", key = "#user.id")// 格式為 userCache::abc ;key = "#user.id" 中usr與下面user對(duì)應(yīng)
@CachePut(cacheNames = "userCache",key = "#result.id")// #result.id 取到返回值id 對(duì)象導(dǎo)航
@CachePut(cacheNames = "userCache",key = "#p0.id")// 取到第一個(gè)參數(shù),這里沒有第二個(gè)參數(shù)所以取不到
@CachePut(cacheNames = "userCache",key = "#a0.id")// 取到第一個(gè)參數(shù),這里沒有第二個(gè)參數(shù)所以取不到
@CachePut(cacheNames = "userCache",key = "#root.args[0].id")// 取到第一個(gè)參數(shù),這里沒有第二個(gè)參數(shù)所以取不到
public User save(@RequestBody User user) {
userMapper.insert(user);
return user;
}但是這也設(shè)置在Redis中會(huì)存在有個(gè)“文件夾”沒有名字,因?yàn)榻邮艿膮?shù)是內(nèi)容:內(nèi)容而在這的格式為內(nèi)容::內(nèi)容所以會(huì)有一個(gè)為空

在上面示例中,想獲取傳入的數(shù)值可以使用,如:user,獲取里面的id可以使用user.id以此類推
所以在上面設(shè)置中顯示的格式為
userCache::id中的值
傳入的值是單個(gè)
如果傳入的值是一個(gè),也可以按照這個(gè)方式去設(shè)置,效果和原理也是一樣的。
@GetMapping
@Cacheable(cacheNames = "userCache", key = "#id")// TODO 3. 將key設(shè)置為 userCache::id
public User getById(Long id) {
User user = userMapper.getById(id);
return user;
}那么在上面的示例中顯示的格式為
userCache::id的值
3、清理緩存
清理緩存使用注解@CacheEvict,使用格式為@CacheEvict(cacheNames = "userCache", key = "#id")
@DeleteMapping("/delAll")
@CacheEvict(cacheNames = "userCache", allEntries = true) // TODO 5. 清理所有數(shù)據(jù)將userCache所有都刪除
public void deleteAll() {
userMapper.deleteAll();
}上述清理格式為
userCache::id的值如果這個(gè)值存在就會(huì)被清除
4、清理所有數(shù)據(jù)將userCache所有都刪除
如果想將所有的開頭為userCache的緩存都清除可以使用@CacheEvict,和清除單個(gè)緩存一樣。
示例:@CacheEvict(cacheNames = "userCache", allEntries = true)
只需要將參數(shù)改為allEntries并且設(shè)置為true即可
@DeleteMapping("/delAll")
@CacheEvict(cacheNames = "userCache", allEntries = true) // TODO 5. 清理所有數(shù)據(jù)將userCache所有都刪除
public void deleteAll() {
userMapper.deleteAll();
}到此這篇關(guān)于SpringCache的基本使用方法的文章就介紹到這了,更多相關(guān)SpringCache使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring循環(huán)依賴正確性及Bean注入的順序關(guān)系詳解
這篇文章主要給大家介紹了關(guān)于Spring循環(huán)依賴的正確性,以及Bean注入的順序關(guān)系的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
Springboot配置suffix指定mvc視圖的后綴方法
這篇文章主要介紹了Springboot配置suffix指定mvc視圖的后綴方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java操作透明圖片并保持背景透明的實(shí)現(xiàn)
這篇文章主要介紹了Java操作透明圖片并保持背景透明的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
4位吸血鬼數(shù)字的java實(shí)現(xiàn)思路與實(shí)例講解
今天小編就為大家分享一篇關(guān)于4位吸血鬼數(shù)字的java實(shí)現(xiàn)思路與實(shí)例講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
java生成pdf表格,調(diào)用itext創(chuàng)建的實(shí)例
這篇文章主要介紹了java生成pdf表格,調(diào)用itext創(chuàng)建的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01
Java使用自定義注解實(shí)現(xiàn)為事件源綁定事件監(jiān)聽器操作示例
這篇文章主要介紹了Java使用自定義注解實(shí)現(xiàn)為事件源綁定事件監(jiān)聽器操作,結(jié)合實(shí)例形式分析了java自定義注解、注解處理、事件監(jiān)聽與響應(yīng)等相關(guān)操作技巧,需要的朋友可以參考下2019-10-10
Java 數(shù)據(jù)庫時(shí)間返回前端顯示錯(cuò)誤(差8個(gè)小時(shí))的解決方法
本文主要介紹了Java 數(shù)據(jù)庫時(shí)間返回前端顯示錯(cuò)誤(差8個(gè)小時(shí))的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
基于Java和FFmpeg實(shí)現(xiàn)視頻壓縮和剪輯功能
在視頻處理開發(fā)中,壓縮和剪輯是常見的需求,本文將介紹如何使用 Java 結(jié)合 FFmpeg 實(shí)現(xiàn)視頻壓縮和剪輯功能,同時(shí)去除數(shù)據(jù)庫操作,僅專注于視頻處理,需要的朋友可以參考下2025-08-08

