【SpringCache】快速入門 通俗易懂

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緩存數據

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209297.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209297.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209297.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Centos7、Mysql8.0 load_file函數返回為空的終極解決方法--暨selinux的深入理解

零、問題背景 最近想換房&#xff0c;為了方便自己對比感興趣的房子&#xff0c;因此決定將目標房源的基本信息放在表里&#xff0c;特別是要一目了然的看到眾多房子的各種圖紙和照片&#xff0c;因此決定要在Mysql8.0.34數據庫中以二進制形式保存圖片&#xff08;拋開合理性和…

喝酒誰先倒

劃拳是古老中國酒文化的一個有趣的組成部分。酒桌上兩人劃拳的方法為&#xff1a;每人口中喊出一個數字&#xff0c;同時用手比劃出一個數字。如果誰比劃出的數字正好等于兩人喊出的數字之和&#xff0c;誰就輸了&#xff0c;輸家罰一杯酒。兩人同贏或兩人同輸則繼續下一輪&…

Vue 2.0源碼分析-update

Vue 的 _update 是實例的一個私有方法&#xff0c;它被調用的時機有 2 個&#xff0c;一個是首次渲染&#xff0c;一個是數據更新的時候&#xff1b;由于我們這一章節只分析首次渲染部分&#xff0c;數據更新部分會在之后分析響應式原理的時候涉及。_update 方法的作用是把 VNo…

思維鏈(CoT)提出者 Jason Wei:關于大語言模型的六個直覺

文章目錄 一、前言二、主要內容三、總結 &#x1f349; CSDN 葉庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 Jason Wei 的主頁&#xff1a;https://www.jasonwei.net/ Jason Wei&#xff0c;一位于 2020 年從達特茅斯學院畢業的杰出青年&#xff0c;隨后加盟了…

大數據安全保障的四種關鍵技術

隨著大數據時代的到來&#xff0c;數據安全保障的重要性日益凸顯。大數據安全保障涉及多種關鍵技術&#xff0c;以下是四種關鍵技術的詳細介紹。 數據加密技術 數據加密技術是大數據安全保障的核心技術之一。它通過將明文數據轉化為密文數據&#xff0c;以保護數據的機密性和完…

CSS中 設置文字下劃線 的幾種方法

在網頁設計和開發中&#xff0c;我們經常需要對文字進行樣式設置&#xff0c;包括字體,顏色&#xff0c;大小等&#xff0c;其中&#xff0c;設置文字下劃線是一種常見需求 一 、CSS種使用 text-decoration 屬性來設置文字的裝飾效果&#xff0c;包括下劃線。 常用的取值&…

Visual Studio 2015 中 FFmpeg 開發環境的搭建

Visual Studio 2015 中 FFmpeg 開發環境的搭建 Visual Studio 2015 中 FFmpeg 開發環境的搭建新建控制臺工程拷貝并配置 FFmpeg 開發文件測試FFmpeg 開發文件的下載鏈接 Visual Studio 2015 中 FFmpeg 開發環境的搭建 新建控制臺工程 新建 Win32 控制臺應用程序。 具體流程&…

炫酷不止一面:探索JavaScript動畫的奇妙世界(下)

&#x1f90d; 前端開發工程師&#xff08;主業&#xff09;、技術博主&#xff08;副業&#xff09;、已過CET6 &#x1f368; 阿珊和她的貓_CSDN個人主頁 &#x1f560; 牛客高級專題作者、在牛客打造高質量專欄《前端面試必備》 &#x1f35a; 藍橋云課簽約作者、已在藍橋云…

proftpd安全加固:限制用戶FTP登錄

其實無所謂安全加固&#xff0c;因為proftp默認就是限制用戶FTP登錄的&#xff0c;這里有點凌亂得研究和實驗了proftpd如何進行限制的&#xff0c;以及可能的放開限制。懂了這些才能更好的進行防護配置。 RootLogin指令其實主要作用就是啟用ROOT訪問。通常&#xff0c;proftpd在…

【Fastadmin】一個完整的輪播圖功能示例

目錄 1.效果展示&#xff1a; 列表 添加及編輯頁面同 2.建表&#xff1a; 3.使用crud一鍵生成并創建控制器 4.html頁面 add.html edit.html index.php 5.js頁面 6.小知識點 1.效果展示&#xff1a; 列表 添加及編輯頁面同 2.建表&#xff1a; 表名&#xff1a;fa_x…

【LabVIEW學習】5.數據通信之TCP協議,控制電腦的一種方式

一。tcp連接以及寫數據&#xff08;登錄&#xff09; 數據通信--》協議--》TCP 1.tcp連接 創建while循環&#xff0c;中間加入事件結構&#xff0c;創建tcp連接&#xff0c;寫入IP地址與端口號 2.寫入tcp數據 登錄服務器除了要知道IP地址以及端口以外&#xff0c;需要用戶名與密…

中通單號查詢,中通快遞物流查,備注需要的單號記錄

批量查詢中通快遞單號的物流信息&#xff0c;并對需要的單號記錄進行備注。 所需工具&#xff1a; 一個【快遞批量查詢高手】軟件 中通快遞單號若干 操作步驟&#xff1a; 步驟1&#xff1a;運行【快遞批量查詢高手】軟件&#xff0c;第一次使用的朋友記得先注冊&#xff0c…

快速冪(C語言)

前言 快速冪算法一般用于高次冪取模的題目中&#xff0c;比如求3的10000次方對7取模。這時候有些同學會說&#xff1a;這還不簡單&#xff1f;我直接調用pow函數然后對結果%7不得了么&#xff1f;可是3的10000次方這么龐大的數字&#xff0c;真的能儲存在計算機里么&#xff1f…

HTML行內元素與塊級元素的區別(超詳細)

目錄 行內元素&#x1f338;常見的行內元素&#x1f338;行內元素&#xff08;內聯元素&#xff09;的特性 塊級元素&#x1f338;常見的塊級元素&#x1f338;塊級元素的特性 相互轉換(display)&#x1f338;行內塊狀元素的特性 行內元素 &#x1f338;常見的行內元素 <s…

c#學習相關系列之as和is的相關用法

一、子類和父類的關系 public class Program{static void Main(string[] args){Animal animal new Dog();// Dog dog (Dog)new Animal(); 編譯成功&#xff0c;運行報錯Dog dog (Dog)animal;Dog dog new Dog();Animal animal dog; //等價于Animal animal new Dog();}}pub…

java多生產者多消費者模擬實現

package com.example.springboottestone.main;import java.util.LinkedList; import java.util.Queue;/*** 多生產者多消費者模型是指多個生產者線程同時向緩沖區中添加數據&#xff0c;同時多個消費者線程從緩沖區中獲取數據的并發模型。這種模型適用于需要高并發處理數據的場…

企業計算機服務器中了eking勒索病毒怎么辦,eking勒索病毒解密數據恢復

隨著計算機網絡技術的不斷發展與應用&#xff0c;企業的生產運營效率得到了極大提升&#xff0c;但網絡安全威脅一直存在&#xff0c;網絡威脅的技術也在不斷更新&#xff0c;給企業的數據安全帶來了嚴重威脅。在本月&#xff0c;云天數據恢復中心陸續接到很多企業的求助&#…

C++ Qt開發:Qt的安裝與配置

Qt是一種C編程框架&#xff0c;用于構建圖形用戶界面&#xff08;GUI&#xff09;應用程序和嵌入式系統。Qt由Qt公司&#xff08;前身為Nokia&#xff09;開發&#xff0c;提供了一套跨平臺的工具和類庫&#xff0c;使開發者能夠輕松地創建高效、美觀、可擴展的應用程序。其被廣…

Python---random庫

目錄 基本隨機數函數(): rand.seed() random() 擴展隨機數函數(): random庫包含兩類函數&#xff1a;基本隨機數函數&#xff0c;擴展隨機數函數 基本隨機數函數:seed(),random() 擴展隨機數函數&#xff1a;randint,getrandbits(),uniform(),randrange(),choice(),shuff…

猴子吃桃問題(for循環)

一只猴子第一天摘下若干個桃子&#xff0c;當即吃了一半&#xff0c;還不過癮&#xff0c;又多吃了一個&#xff1b;第二天早上又將剩下的桃子吃掉一半&#xff0c;又多吃了一個。以后每天早上都吃了前一天剩下的一半加一個。到第N天早上想再吃時&#xff0c;見只剩下一個桃子了…