Spring Cache實現簡化緩存功能開發

一. 介紹

Spring Cache 是 Spring 框架提供的緩存抽象層,它簡化了在應用中添加緩存功能的開發工作。通過 Spring Cache,開發者無需關注具體緩存實現的細節,只需通過注解就能快速實現方法級別的緩存管理。

核心特點

1. 與具體緩存實現解耦:

支持多種緩存技術(如 Caffeine、EhCache、Redis 等),可通過配置靈活切換

2. 注解驅動:

通過簡單的注解即可實現緩存的增、刪、改、查操作

3. 支持多種緩存操作

包括緩存數據存儲、讀取、更新和清除

4. 事務感知:

能與 Spring 事務結合,確保緩存與數據的一致性

核心注解說明

注解作用關鍵屬性
@Cacheable緩存方法結果,優先從緩存讀取key:緩存鍵;condition:條件緩存
@CachePut執行方法后更新緩存(方法必執行)key:緩存鍵
@CacheEvict從緩存中刪除數據key:刪除指定鍵;allEntries=true:刪除所有
@Caching組合多個緩存注解(如同時更新和刪除)包含?cacheableputevict?等屬性
@CacheConfig類級別配置緩存名稱、鍵生成器等cacheNames:默認緩存名稱

二. 使用步驟

1.導入maven坐標

使用的緩存中間件為redis

<!-- Spring Cache 核心依賴 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency><!-- Redis 緩存實現(可選,根據需要替換) -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2. 在Spring啟動類上添加@EnableCaching注解開啟緩存功能

@SpringBootApplication
@Slf4j
@EnableCaching//開啟緩存注解功能
public class SkyApplication {public static void main(String[] args) {SpringApplication.run(SkyApplication.class, args);log.info("server started");}
}

3. 在業務方法上使用緩存注解

@Service
@CacheConfig(cacheNames = "users") // 類級別統一指定緩存名稱
public class UserService {// 1. 查詢用戶:緩存結果,鍵為用戶 ID@Cacheable(key = "#id") // 緩存鍵 = id,如 "users::1"public User getUserById(Long id) {// 實際業務:查詢數據庫(僅第一次執行,后續從緩存獲取)System.out.println("查詢數據庫,用戶 ID:" + id);return userRepository.findById(id).orElse(null);}// 2. 更新用戶:更新緩存(方法始終執行,結果存入緩存)@CachePut(key = "#user.id") // 緩存鍵 = user.idpublic User updateUser(User user) {// 實際業務:更新數據庫System.out.println("更新數據庫,用戶 ID:" + user.getId());return userRepository.save(user);}// 3. 刪除用戶:清除緩存@CacheEvict(key = "#id") // 清除鍵 = id 的緩存public void deleteUser(Long id) {// 實際業務:刪除數據庫記錄System.out.println("刪除數據庫,用戶 ID:" + id);userRepository.deleteById(id);}// 4. 清除所有緩存(如批量刪除場景)@CacheEvict(allEntries = true) // 清除 "users" 緩存中所有數據public void clearAllUsersCache() {// 無需業務邏輯,僅用于清除緩存}
}

@Cacheable的執行邏輯:每次調用有這個注解的方法時,先去redis緩存中查詢數據,如果有,直接將緩存中的數據返回,不執行方法;如果沒有,執行方法,調用數據庫,將方法的返回值存入redis中,這樣一來,下次執行方法就不用查詢數據庫,提高了效率

@CacheEvict:在修改員工信息,批量刪除員工,啟用停用員工等場景下,會使用allEntries = true(清空全部緩存)

現在有一個場景:一個公司內有幾個部門,部門下分別有各自的員工,redis中以部門id為鍵存儲員工信息,為什么刪除或者新增一個用戶就要將員工所在的部門的緩存清空呢,原因是這樣的增刪操作并不頻繁,而精確在redis中操作比較麻煩,且在刪除或者新增時,redis中的緩存已經和數據庫中的數據不一致,所以需要清空緩存,下次查詢操作時又將新的數據緩存到redis

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

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

相關文章

Lombok(簡化Java當中的開發)

Lombok概述 以前的Java項目中,充斥著太多不友好的代碼:POJO的getter/setter/toString/構造方法;打印日志;I/O流的關閉操作等等,這些代碼既沒有技術含量,又影響著代碼的美觀,Lombok應運而生。 LomBok可以通過注解,幫助開發人員消除JAVA中尤其是POJO類中的冗長代碼。 使…

【DeepSeek】公司內網部署離線deepseek+docker+ragflow本地模型實戰

企業內部可能有些數據比較敏感&#xff0c;不能連接互聯網。本次實驗操作是將deepseek完全離線后遷移至內網使用&#xff0c;實驗基于Windows server 2022 datacenter系統安裝deepseek、docker、ragflow。 目錄使用VMware新建WIN2022虛擬機一、安裝DeepSeek模型二.安裝Docker使…

【軟考架構】面向服務的體系結構(SOA)深度解析

面向服務的體系結構&#xff08;SOA&#xff09;深度解析 面向服務的體系結構&#xff08;Service-Oriented Architecture, SOA&#xff09;是一種以服務為核心的軟件架構范式&#xff0c;通過標準化接口實現異構系統間的高效集成與協作。以下從概念定義、發展脈絡、技術演進、…

centos7中MySQL 5.7.32 到 5.7.44 升級指南:基于官方二進制包的原地替換式升級

目錄前言1. 升級概述1.1 升級背景1.2 升級目的1.3 升級方法概述1.4 升級策略與注意事項2. 升級準備2.1 備份工作2.2 下載目標版本2.3 停止 MySQL 服務3. 替換二進制文件3.1 解壓官方二進制包3.2 替換核心二進制文件3.3 更新共享庫4. 執行升級并驗證4.1 啟動 MySQL 服務4.2 監控…

數學七夕花禮(MATLAB版)

前言參考的視頻在抖音&#xff0c;電腦版的抖音一直登錄不了&#xff0c;用手機分享的鏈接如下所示。4.35 Iv.FH yTl:/ 04/04 復制打開抖音&#x1f440;數學送的七夕花禮&#xff0c;記得查收噢.# 七夕花禮請查收 ... https://v.douyin.com/H-YpOJCyQyg/rho4sin(8theta)公式&a…

LeetCode - 21. 合并兩個有序鏈表

題目 21. 合并兩個有序鏈表 思路 我會采用雙指針的方法&#xff0c;同時遍歷兩個鏈表&#xff0c;比較當前節點的值&#xff0c;將較小的節點添加到結果鏈表中。 具體思路是這樣的&#xff1a; 首先創建一個啞節點(dummy node)作為合并后鏈表的頭部&#xff0c;這樣可以簡…

ES01-環境安裝

ES01-環境安裝 文章目錄ES01-環境安裝1-參考網址2-知識總結1-參考網址 elasticsearch官網地址&#xff1a;https://www.elastic.co/安裝elasticsearch9.0.0參考&#xff1a;https://zhuanlan.zhihu.com/p/1920780524991017021安裝elasticsearch9.0.0參考&#xff1a;http://ww…

UI前端大數據可視化實戰策略:如何設計符合用戶認知的數據可視化界面?

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!UI前端大數據可視化實戰策略&#xff1a;如何設計符合用戶認知的數據可視化界面&#xff1f;數…

學習python第15天

其實前面學的根本不記得了&#xff0c;小丑.jpg&#xff0c;如果真的面試問到了估計也是一臉懵今日任務&#xff1a;JSON先認識一下JSON和JSONL文件記得之前在面試KIMI的時候&#xff0c;面試官就給我出了JSONL和EXCEL轉換的手撕代碼題&#xff0c;而那個時候&#xff0c;我連什…

Spring框架集成Kakfa的方式

Spring框架集成Kakfa的方式 springboot集成kafka的方式 添加maven依賴 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.0</version> </dependency&g…

【藍橋杯 2024 省 Python B】繳納過路費

【藍橋杯 2024 省 Python B】繳納過路費 藍橋杯專欄&#xff1a;2024 省 Python B 算法競賽&#xff1a;圖論&#xff0c;生成樹&#xff0c;并查集&#xff0c;組合計數&#xff0c;kruskal 最小生成樹&#xff0c;乘法原理 題目鏈接&#xff1a;洛谷 【藍橋杯 2024 省 Python…

個性化導航新體驗:cpolar讓Dashy支持語音控制

文章目錄簡介1. 安裝Dashy2. 安裝cpolar3.配置公網訪問地址4. 固定域名訪問用 cpolar 讓 Dashy 管理個人導航站就是這么簡單&#xff01;三步輕松搞定&#xff1a;在電腦上安裝 Dashy&#xff0c;拖拽添加常用網站&#xff0c;運行 cpolar 生成遠程訪問鏈接。這個方法不僅免費&…

SQL學習記錄

基本的&#xff0c;增、刪&#xff0c;改insert into table_name (列1, 列2,...) VALUES (值1, 值2,....)Delete from 表 where keyvalueupdate 表 set keyvalue,keyvalue where keyvalue查用的最多whereSELECT prod_name, prod_price FROM Products WHERE vend idDLLO1OR ve…

零基礎學C++,函數篇~

C基礎學習&#xff08;DAY_06&#xff09;函數1. 函數的定義與使用2. 函數參數傳遞3. 變量的聲明周期4. 函數的其他特性5. 函數的嵌套與遞歸函數 1. 函數的定義與使用 ? 在設計程序時&#xff0c;如果一段代碼重復進行某種操作或者完成一個特定的功能&#xff0c;就應該將這…

react+vite+ts 組件模板

1.創建項目npm create vitelatest my-app --template react-ts2.配置項目 tsconfig.json{"compilerOptions": {"target": "ES2020","useDefineForClassFields": true,"lib": ["ES2020", "DOM", "D…

C語言 - 輸出參數詳解:從簡單示例到 alloc_chrdev_region

C語言中的輸出參數詳解&#xff1a;以 alloc_chrdev_region 為例 在學習 C 語言函數調用時&#xff0c;我們常常接觸到“輸入參數”&#xff0c;比如把一個數字傳給函數&#xff0c;讓函數幫我們算出結果。但有時候可能會發現&#xff0c;有些函數除了返回值之外&#xff0c;還…

機器視覺學習-day09-圖像矯正

1 仿射變換與透視變換1.1 仿射變換之前在圖像旋轉實驗中已經接觸過仿射變換&#xff0c;仿射變換是一個二維坐標系到另一個二維坐標系的過程&#xff0c;在仿射變換中符合直線的平直性和平行性。1.2 透視變換透視變換是把一個圖像投影到一個新的視平面的過程。在現實世界中&…

杰理ac791獲取之前版本sdk

很慚愧&#xff0c;一個如此簡單的問題卡了這么久&#xff0c;運動戰的本質就是多找線索&#xff0c;多嘗試

基于軸重轉移補償和多軸協調的粘著控制方法研究

基于軸重轉移補償和多軸協調的粘著控制方法研究 1. 論文標題 基于軸重轉移補償和多軸協調的粘著控制方法研究 2. 內容概括 該論文針對重載電力機車在復雜軌面條件下易發生空轉的問題,提出了一種新型粘著控制方法。傳統方法僅考慮單軸粘著利用而忽略軸間關系,本文設計了包…

臺達 PLC 軟件導入 EDS 文件后不能通過 PDO 控制的解決方法

一、功能及注意事項 1.功能說明&#xff1a;通過修改 EDS 文件處理臺達 PLC 軟件導入 EDS 文件后不能通過 PDO 控制的解決方法 2.注意事項&#xff1a;1).此文檔只針對立邁勝 CANopen 通訊一體化電機&#xff1b; 2).EDS 文件可以用記事本打開&#xff1b; 二、EDS 文件修改 IS…