Spring緩存注解深度實戰:3大核心注解解鎖高并發系統性能優化?

引言:緩存——高并發系統的“性能加速器”?

在互聯網應用中,數據庫查詢往往是性能瓶頸的核心。當每秒數千次的請求直接沖擊數據庫時,系統響應速度會急劇下降,甚至引發宕機風險。?緩存技術?應運而生,成為解決這一痛點的關鍵方案。但傳統的手動緩存管理(如代碼中顯式調用put/get方法)不僅繁瑣,還會讓業務邏輯與緩存邏輯高度耦合,代碼維護成本極高。

Spring框架通過?聲明式緩存注解?(如@Cacheable、@CachePut、@CacheEvict),將緩存操作抽象為注解,讓開發者通過簡單配置即可實現緩存邏輯與業務邏輯的解耦。本文將通過真實場景案例,帶你徹底掌握這三大核心注解的用法,并揭秘如何整合Redis實現高效緩存管理。

一、三大核心注解:緩存操作的“三板斧”?

1. @Cacheable:緩存查詢的“智能開關”?

功能?:首次查詢數據庫后緩存結果,后續相同請求直接返回緩存數據。
適用場景?:高頻讀取且數據更新頻率低(如用戶信息、商品詳情)。
代碼示例?:

@Cacheable(value = "userCache", key = "#id", condition = "#id > 10")
public User getUserById(Long id) {// 僅當id>10時啟用緩存return userDao.findById(id);
}

關鍵屬性?:
value/cacheNames:指定緩存名稱(如userCache)。
key:緩存鍵,支持SpEL表達式(如#id表示方法參數)。
condition:動態控制是否啟用緩存(如#id > 10)。

2. @CachePut:緩存更新的“同步器”?

功能?:無論緩存是否存在,始終執行方法并更新緩存。
適用場景?:數據更新后需同步緩存(如用戶信息修改)。
代碼示例?:

@CachePut(value = "userCache", key = "#user.id")
public User updateUser(User user) {userDao.update(user);return user; // 返回最新對象覆蓋舊緩存
}
3. @CacheEvict:緩存清理的“掃地僧”?

功能?:刪除指定緩存,支持單條或批量清理。
適用場景?:數據刪除或批量更新后清理緩存。
代碼示例?:

@CacheEvict(value = "userCache", key = "#id", allEntries = false)
public void deleteUser(Long id) {userDao.delete(id); // 刪除后清除對應緩存
}

關鍵屬性?:
allEntries:是否清空整個緩存區域(如userCache下的所有鍵)。
beforeInvocation:是否在方法執行前清除緩存(避免方法異常導致緩存未清理)。

二、整合Redis實戰:配置與避坑指南?

1. 依賴與配置?

依賴引入?(pom.xml):

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>

Redis連接配置?(application.yml):

spring:redis:host: 127.0.0.1port: 6379cache:redis:time-to-live: 600  # 統一緩存超時時間(秒)
2. 緩存配置類?
@Configuration
@EnableCaching
public class RedisCacheConfig {@Beanpublic RedisCacheManager cacheManager(RedisConnectionFactory factory) {// 使用JSON序列化避免Redis中存儲亂碼RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(600)) // 全局緩存超時時間.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));return RedisCacheManager.builder(factory).cacheDefaults(config).build();}
}
3. 避坑指南?

實體類必須實現Serializable接口?:否則Redis序列化會拋出異常。

@Data
public class User implements Serializable { ... }

避免緩存穿透?:對null值進行緩存或使用布隆過濾器。

@Cacheable(value = "userCache", key = "#id", unless = "#result == null")

緩存雪崩防護?:為不同緩存設置隨機超時時間,避免同時失效。

三、真實場景測試:驗證緩存效果?

@SpringBootTest
public class CacheTest {@Autowiredprivate UserService userService;@Testpublic void testCache() {// 第一次查詢:訪問數據庫,存入緩存User user1 = userService.getUserById(1L);  // 輸出:執行數據庫查詢...// 第二次查詢:直接讀取緩存User user2 = userService.getUserById(1L);  // 無輸出// 更新用戶user1.setName("Updated");userService.updateUser(user1);             // 更新數據庫并覆蓋緩存// 刪除用戶userService.deleteUser(1L);                // 刪除數據庫并清除緩存}
}
四、進階技巧:靈活運用緩存策略?

多級緩存?:結合本地緩存(Caffeine)與Redis,進一步提升性能。
條件緩存?:通過condition和unless動態控制緩存邏輯。

@Cacheable(value = "hotData", unless = "#result.views < 1000")

分布式鎖?:在緩存擊穿場景下,使用Redis鎖保護數據庫。

五、總結:緩存注解的價值與適用邊界?

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

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

相關文章

CSS元素動畫篇:基于當前位置的變換動畫(二)

基于當前位置的變換動畫&#xff08;二&#xff09; 前言旋轉效果類元素動畫搖擺動畫效果效果預覽代碼實現 搖晃動畫效果效果預覽代碼實現 螺旋旋轉效果預覽代碼實現 結語 前言 CSS元素動畫一般分為兩種&#xff1a;一種是元素基于當前位置的變換動畫&#xff0c;通過不明顯的…

Qt/C++開發監控GB28181系統/設備注冊/設備注銷/密碼認證/心跳保活/校時

一、前言 根據gb28181協議文檔&#xff0c;第一步就是需要實現設備的注冊&#xff0c;和onvif不同&#xff0c;gb是反過來的&#xff0c;設備端主動連接服務端&#xff0c;而onvif是服務端主動發出搜索&#xff0c;設備被動應答&#xff0c;包括后續的交互幾乎都是被動應答&am…

MATLAB 中的圖形繪制

一、線圖 plot 函數用來創建x和y值的簡單線圖。 x 0 : 0.05 : 30; %從0到30&#xff0c;每隔0.05取一次值 y sin(x); plot(x,y,LineWidth,2) %若&#xff08;x&#xff0c;y&#xff0c;LineWidth&#xff0c;2&#xff09;可變粗 xlabel("橫軸標題") ylab…

go語言八股文(五)

1.go的局部變量是分配在棧上還是在堆上 在Go語言中&#xff0c;局部變量的內存分配&#xff08;棧或堆&#xff09;由編譯器基于逃逸分析&#xff08;escape analysis&#xff09;來決定。以下是總結和具體示例&#xff1a; 棧上分配 當局部變量的生命周期嚴格限定在函數作用…

Gradients of Matrix-Matrix Multiplication in Deep Learning

Gradients of Matrix-Matrix Multiplication in Deep Learning 1. Matrix multiplication2. Derivation of the gradients2.1. Dimensions of the gradients2.2. The chain rule2.3. Derivation of the gradient ? L ? A \frac{ {\partial L} }{ {\partial \boldsymbol {\bo…

Spring Boot 框架簡介

? Spring Boot 框架簡介 1?? &#x1f680; 快速構建 Spring Boot 能夠快速構建可直接運行的、企業級 Spring 應用。 2?? ?? “約定優于配置” 該框架采用"約定優于配置"理念&#xff0c;默認集成 Spring 平臺與主流第三方庫&#xff0c;開發者僅需簡單配置…

【Robocorp實戰指南】Python驅動的開源RPA框架

目錄 前言技術背景與價值當前技術痛點解決方案概述目標讀者說明 一、技術原理剖析核心概念圖解核心作用講解關鍵技術模塊說明技術選型對比 二、實戰演示環境配置要求核心代碼實現案例1&#xff1a;網頁數據抓取案例2&#xff1a;Excel報表生成 運行結果驗證 三、性能對比測試方…

如何使用 Spring Boot 實現分頁和排序:配置與實踐指南

在現代 Web 應用開發中&#xff0c;分頁和排序是處理大量數據時提升用戶體驗和系統性能的關鍵功能。Spring Boot 結合 Spring Data JPA 提供了簡單而強大的工具&#xff0c;用于實現數據的分頁查詢和動態排序&#xff0c;廣泛應用于 RESTful API、后臺管理系統等場景。2025 年&…

使用 LLM助手進行 Python 數據可視化

在數據科學中&#xff0c;數據可視化是一項至關重要的任務&#xff0c;旨在揭示數據背后的模式和洞察&#xff0c;并向觀眾傳達這些信息。然而&#xff0c;在編程語言&#xff08;如 Python&#xff09;中創建有洞察力的圖表有時可能會耗時且復雜。本文介紹了一種借助 AI 助手&…

RASP技術是應用程序安全的“保護傘”

對于企業組織而言&#xff0c;隨著新技術的不斷涌現&#xff0c;企業在應用程序和數據安全方面也面臨著諸多挑戰。之所以如此&#xff0c;是因為常見的保護措施&#xff0c;如入侵防御系統和Web應用程序防火墻&#xff0c;有助于檢測和阻止網絡層的攻擊&#xff0c;但它們無法看…

安卓基礎(接口interface)

??1. 接口的定義與實現?? ??(1) 定義接口?? // 定義一個 "動物行為" 的接口 public interface Animal {void eat(); // 抽象方法&#xff08;無實現&#xff09;void sleep(); // 抽象方法&#xff08;無實現&#xff09;// Java 8 默認方法&#…

Linux0.11內存管理:相關代碼

ch13_2 源碼分析 boot/head.s 頁表初始化&#xff1a; 目標&#xff1a;初始化分頁機制&#xff0c;將線性地址空間映射到物理內存&#xff08;前 16MB&#xff09;&#xff0c;為保護模式下的內存管理做準備。核心流程 分配頁目錄表和頁表的物理內存空間&#xff08;通過 .…

【Redis】set類型

目錄 1、介紹2、底層實現【1】整數集合【2】哈希表 3、常用指令 1、介紹 Redis的set集合類型是一種無序且元素唯一的數據結構&#xff0c;支持高效的成員判斷、集合運算和隨機訪問。 2、底層實現 【1】整數集合 適用場景 當集合中所有的元素都是整數&#xff0c;且元素數量…

web技術與nginx網站環境部署

一&#xff1a;web基礎 1.域名和DNS 1.1域名的概念 網絡是基于TCP/IP協議進行通信和連接的,每一臺主機都有一個唯一的標識(固定的IP地址)&#xff0c;用以區別在網絡上成千上萬個用戶和計算機。網絡在區分所有與之相連的網絡和主機時&#xff0c;均采用一種唯一、通用的地址…

LeetCode【劍指offer】系列(動態規劃篇)

劍指offer10-I.斐波那契數列 題目鏈接 題目&#xff1a;斐波那契數&#xff08;通常用F(n)表示&#xff09;形成的序列稱為斐波那契數列 。該數列由 0 和 1 開始&#xff0c;后面的每一項數字都是前面兩項數字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(…

JVM 內存分配策略

引言 在 Java 虛擬機&#xff08;JVM&#xff09;中&#xff0c;內存分配與垃圾回收是影響程序性能的核心機制。內存分配的高效性直接決定了對象創建的速率&#xff0c;而垃圾回收策略則決定了內存的利用率以及系統的穩定性。為了在復雜多變的應用場景中實現高效的內存管理&am…

【二分查找】尋找峰值(medium)

6. 尋找峰值&#xff08;medium&#xff09; 題?描述&#xff1a;解法?&#xff08;?分查找算法&#xff09;&#xff1a;算法思路&#xff1a;C 算法代碼&#xff1a;Java 算法代碼&#xff1a; 題?鏈接&#xff1a;162. 尋找峰值 題?描述&#xff1a; 峰值元素是指其值…

MongoDB與PHP7的集成與優化

MongoDB與PHP7的集成與優化 引言 隨著互聯網技術的飛速發展,數據庫技術在現代軟件開發中扮演著越來越重要的角色。MongoDB作為一種流行的NoSQL數據庫,以其靈活的數據模型和強大的擴展性受到眾多開發者的青睞。PHP7作為當前最流行的服務器端腳本語言之一,其性能和穩定性也得…

【GIT】github中的倉庫如何刪除?

你可以按照以下步驟刪除 GitHub 上的倉庫&#xff08;repository&#xff09;&#xff1a; &#x1f6a8; 注意事項&#xff1a; ??刪除倉庫是不可恢復的操作&#xff0c;所有代碼、issue、pull request、release 等內容都會被永久刪除。 &#x1f9ed; 刪除 GitHub 倉庫步驟…

焊接機排錯

焊接機 一、前定位后焊接 兩個機臺&#xff0c;①極柱定位&#xff0c;相機定位所有極柱點和mark點&#xff1b;②焊接機&#xff0c;相機定位mark點原理&#xff1a;極柱定位在成功定位到所有極柱點和mark點后&#xff0c;可以建立mark點和極柱點的關系。焊接機定位到mark點…