Spring Cache:簡化緩存管理的抽象框架

Spring Cache

Spring Cache是Spring框架提供的緩存抽象層,通過注解和自動化配置,簡化應用中對緩存的操作,支持多種緩存實現(如Redis、Ehcache、Caffeine)。

1. 核心特性

  • 聲明式緩存:通過注解(如@Cacheable、@CacheEvict)聲明緩存行為,無需手動編寫緩存邏輯。
  • 多緩存實現支持:兼容Redis、Ehcache、Caffeine等緩存工具,通過統一接口切換實現。
  • 與Spring無縫集成:基于AOP動態代理,攔截方法調用自動處理緩存。
  • 靈活的緩存策略:支持條件緩存(condition)、緩存鍵生成(key)、緩存過期等配置。

2. 核心注解

注解作用常用參數示例
@EnableCaching開啟緩存注解功能,通常加在啟動類上
@Cacheable方法結果緩存。在方法執行前先查詢緩存中是否有數據,如果有數據則直接返回緩存數據;如果沒有緩存數據,調用方法并將方法返回值放到緩存中value(緩存名)、key(鍵)、condition(條件)緩存數據庫查詢結果
@CachePut更新緩存,將方法的返回值放到緩存中value(緩存名)、key(鍵)、condition(條件)數據更新后刷新緩存
@CacheEvict刪除緩存,將一條或多條數據從緩存中刪除allEntries(清空所有鍵)、beforeInvocation(執行前刪除)數據清除時刪除緩存

1. @Cacheable:

? ? ? ?作用:標記方法的結果需要被緩存。當方法被調用時,先檢查緩存是否存在對應鍵值,若存在則直接返回緩存值,否則執行方法并將結果存入緩存。

? ? ? ? 使用場景:查詢操作(如數據庫查詢、復雜計算等)。

? ? ? ? 示例:

@Cacheable(value = "userCache", key = "#userId", condition = "#userId != null")
public User getUserById(Long userId) {return userRepository.findById(userId).orElse(null);
}

2. @CachePut:

? ? ? ? 作用:更新緩存。無論緩存是否存在,都會執行方法,并將結果更新到緩存中。

? ? ? ? 適用場景:新增或更新操作(如更新用戶信息后同步緩存)。

? ? ? ? 示例:

@CachePut(value = "userCache", key = "#user.id")
public User updateUser(User user) {return userRepository.save(user);
}

3. @CacheEvict

? ? ? ? 作用:刪除緩存。根據條件清除指定鍵或整個緩存區的數據。

? ? ? ? 適用場景:刪除操作(如用戶刪除后清理緩存)。

? ? ? ??示例:

@CacheEvict(value = "userCache", key = "#userId")
public void deleteUser(Long userId) {userRepository.deleteById(userId);
}// 清空整個緩存區
@CacheEvict(value = "userCache", allEntries = true)
public void clearAllUserCache() {}

3.使用步驟(以Redis為例)

添加依賴:

<!-- Spring Boot Starter 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>

配置緩存類型與Redis:

# application.properties
spring.cache.type=redis
spring.redis.host=localhost
spring.redis.port=6379
# 可選:設置緩存過期時間(單位:毫秒)
spring.cache.redis.time-to-live=60000

啟用緩存:在啟動類添加@EnableCaching

@SpringBootApplication
@EnableCaching
public class MyApp { ... }

在Service層使用注解:

// 僅當參數id>10時緩存
@Cacheable(value = "users", condition = "#id > 10")// 結果不為null時緩存
@Cacheable(value = "users", unless = "#result == null")

4. 緩存鍵與條件控制

自定義緩存鍵(SpEL表達式)

@Cacheable(value = "orders", key = "#userId + ':' + #status")
public List<Order> getOrdersByUserAndStatus(Long userId, String status) { ... }

條件緩存(condition和unless)

// 僅當參數id>10時緩存
@Cacheable(value = "users", condition = "#id > 10")// 結果不為null時緩存
@Cacheable(value = "users", unless = "#result == null")

5. 適用場景

  1. 高頻讀低頻寫:如商品詳情頁、用戶信息查詢。
  2. 耗時計算:緩存復雜計算結果(如報表生成)。
  3. API限流:緩存接口調用次數。
  4. 會話管理:分布式環境下用戶狀態緩存。

Spring Cache通過簡化緩存邏輯與代碼解耦,顯著提升了開發效率。結合Redis等高性能緩存工具,能夠輕松應對高并發場景。

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

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

相關文章

求矩陣某列的和

設計函數sum_column( int A[E1(n)][E2(n)], int j )&#xff0c;E1(n)和E2(n)分別為用宏定義的行數和列數&#xff0c;j為列號。在該函數中&#xff0c;設計指針ptr&A[0][j]&#xff0c;通過*ptr及ptrptrE2(n)訪問第j列元素&#xff0c;從而求得第j列元素的和。在主函數中定…

IM騰訊Trtc與vod云點播:實現合流錄制并上傳,根據參數返回視頻地址

全文目錄,一步到位 1.前言簡介1.1 專欄傳送門1.1.1 文檔傳送門 2. java基礎使用2.1 準備工作2.1.1 云控制臺獲取(密鑰和密鑰secret)2.1.2 找到trtc控制臺2.1.3 vod云點播控制臺 2.2 使用準備的數據進行操作2.2.0 引入依賴2.2.1 創建TrtcUtils工具類2.2.2 TrtcReqDTO 錄制請求dt…

藍橋杯 數三角

問題描述 小明在二維坐標系中放置了 n 個點&#xff0c;他想從中選出一個包含三個點的子集&#xff0c;使得這三個點能夠組成一個三角形。 由于這樣的方案太多了&#xff0c;他決定只選擇那些可以組成等腰三角形的方案。 請幫他計算出一共有多少種選法可以組成等腰三角形。 …

【Kafka】從理論到實踐的深度解析

在當今數字化轉型的時代&#xff0c;企業面臨著數據量呈指數級增長、業務系統愈發復雜的挑戰。在這樣的背景下&#xff0c;高效的數據傳輸與處理技術成為了關鍵。Kafka&#xff0c;作為一款分布式消息隊列系統&#xff0c;憑借其卓越的性能和豐富的特性&#xff0c;在眾多企業的…

Linux課程學習一

一.fopen與fclose函數 linux中fopen函數直接用man fopen 去查看 函數原型 FILE * fopen(constchar *path , cost char *mode) /* * description : 打開一個文件 * param ‐ path : 指定文件路徑,如&#xff1a;"./test.txt"&#xff0c;也可以直接由文件名 * param …

【區塊鏈安全 | 第十篇】智能合約概述

部分內容與前文互補。 文章目錄 一個簡單的智能合約子貨幣&#xff08;Subcurrency&#xff09;示例區塊鏈基礎交易區塊預編譯合約 一個簡單的智能合約 我們從一個基礎示例開始&#xff0c;該示例用于設置變量的值&#xff0c;并允許其他合約訪問它。 // SPDX-License-Identi…

XML標簽格式轉換為YOLO TXT格式

針對的是多邊形&#xff08;<polygon>&#xff09;來描述對象的邊界&#xff0c;而不是傳統的矩形框&#xff08;<bndbox>&#xff09; import xml.etree.ElementTree as ET import os from pathlib import Path# 解析VOC格式的XML文件&#xff0c;提取目標框的標…

大唐杯02 DTM.PX4.016

01 5G關鍵技術概述 回傳壓力大&#xff1a;核心網向基站回傳壓力大 02 5G關鍵技術介紹01

CSS3學習教程,從入門到精通, CSS3 盒子模型的詳細語法知識點及案例代碼(23)

CSS3 盒子模型的詳細語法知識點及案例代碼 CSS3 盒子模型完整指南 一、盒子模型基礎 每個 HTML 元素都被視為一個矩形盒子&#xff0c;由以下部分組成&#xff1a; 內容區 (Content)內邊距 (Padding)邊框 (Border)外邊距 (Margin) 二、語法知識點詳解 1. 盒子的寬和高 sel…

《Linux運維實戰:Ubuntu 22.04修改root用戶默認名并禁止登錄》

總結&#xff1a;整理不易&#xff0c;如果對你有幫助&#xff0c;可否點贊關注一下&#xff1f; 更多詳細內容請參考&#xff1a;Linux運維實戰總結 一、背景信息 由于安全方面的考慮&#xff0c;先要求Ubuntu 22.04系統重的root用戶禁止登錄&#xff0c;并修改用戶名root為ad…

docker-compose自定義網絡,解決docker-compose網段路由沖突

問題排查 先route一波查看一下路由表 容器路由19和堡壘機路由沖突 解決方案 更改docker網段更改docker生成容器的網段 > 基本操作 docker network ls &#xff1a;查看docker網絡列表 docker network inspect <network id/name>&#xff1a;查看某個docker網絡詳情…

前端 - ts - - declare聲明類型

在使用typeScript的項目中 需要聲明屬性類型 單獨的局部屬性 可以直接在當前文件中聲明 全局屬性需要在項目根目錄下新建.d.ts文件 vite會自動識別.d.ts類型文件 在該文件中使用declare聲明類型有三種寫法 1、在某種類型的文件中聲明 2、聲明window上的屬性類型 3、全局聲明…

[Mac]利用Hexo+Github Pages搭建個人博客

由于我這臺Mac基本沒啥環境&#xff0c;因此需要從零開始配置&#xff0c;供各位參考。 注意??&#xff1a;MacBook (M4)使用/bin/zsh作為默認Shell&#xff0c;其對應的配置文件為~/.zshrc 參考文檔&#xff1a; HEXO系列教程 | 使用GitHub部署靜態博客HEXO | 小白向教程 文…

運維面試題(十一)

1.如果一個硬盤 IO 時阻塞了&#xff0c;會發生什么情況&#xff1f; 進程/線程掛起&#xff1a;發起I/O操作的進程或線程會被操作系統置為阻塞狀態&#xff08;等待狀態&#xff09;&#xff0c;直到I/O完成。CPU資源釋放&#xff1a;阻塞的線程會讓出CPU&#xff0c;操作系統…

sql2022 復制 事務級別發布后無法刪除

Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission. 用SA用戶登錄執行下列語句 USE [xxxxx] GO EXEC dbo.sp_changedbowner loginame Nsa, …

合規+增效 正也科技攜智能營銷產品出席中睿論壇

正也科技作為醫藥數字化領域的標桿企業&#xff0c;受邀參展第二屆中睿醫健產業企業家年會暨第十三屆中睿醫藥新春論壇&#xff0c;本次論壇以“合力啟新程”為主題&#xff0c;吸引了800多位醫藥健康企業的董事長、總經理參與&#xff0c;并通過主論壇、分論壇、路演等形式探討…

ubuntu 安裝 postgresql

在 Ubuntu 系統中安裝 PostgreSQL 的步驟如下&#xff1a; 步驟 1&#xff1a;更新軟件包列表 sudo apt update步驟 2&#xff1a;安裝 PostgreSQL Ubuntu 默認倉庫包含 PostgreSQL&#xff0c;直接安裝&#xff1a; sudo apt install postgresql postgresql-contrib -ypost…

智能巡檢機器人:2025年企業安全運維的“數字哨兵“

文章目錄 一、2025年&#xff0c;為什么企業需要智能巡檢機器人&#xff1f;二、2025年智能巡檢機器人的六大核心價值三、2025行業落地實景1. 電網系統——"巡線鷹"集群作戰2. 化工園區——"防爆衛士"全天候守護3. 數據中心——"冷血偵探"精準運…

K8S學習之基礎五十一:k8s部署jenkins

k8s部署jenkins 創建nfs共享目錄&#xff0c; mkdir -p /data/v2 echo /data/v2 *(rw,no_root_squash) > /etc/exports exportfs -arv創建pv、pvc vi pv.yaml apiVersion: v1 kind: PersistentVolume metadata:name: jenkins-k8s-pv spec:capacity:storage: 1GiaccessMod…

Vue實現的表格多選方案支持跨頁選擇和回顯功能

以下是純Vue實現的表格多選方案&#xff08;不依賴UI庫&#xff09;&#xff0c;支持跨頁選擇和回顯功能&#xff1a; <template><div class"custom-table"><!-- 表格主體 --><table><thead><tr><th><input type"…