Spring Boot 緩存最佳實踐:從基礎到生產的完整指南

在這里插入圖片描述

Spring Boot 緩存最佳實踐:從基礎到生產的完整指南


引言

在現代分布式系統中,緩存是提升系統性能的銀彈。Spring Boot 通過 spring-boot-starter-cache? 模塊提供了開箱即用的緩存抽象,但如何根據業務需求實現靈活、可靠的緩存方案?本文將帶您從零開始,逐步構建符合生產要求的緩存系統。


一、基礎篇:5分鐘快速接入

1.1 最小化配置

pom.xml 依賴

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

Nacos 配置(application.yml)

spring:cache:type: simple # 默認內存緩存

啟動類注解

@SpringBootApplication
@EnableCaching
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

業務層使用

@Service
public class ProductService {@Cacheable("products")public Product getProduct(Long id) {// 數據庫查詢邏輯}
}

二、進階篇:多緩存引擎支持

2.1 緩存類型切換

配置選項對比

類型依賴適用場景特點
?simple?內置開發測試環境無過期策略
?caffeine?com.github.ben-manes.caffeine高性能本地緩存支持多種過期策略
?redis?spring-boot-starter-data-redis分布式生產環境支持持久化、集群

Nacos 配置示例

spring:cache:type: redis # 切換緩存引擎# Redis 連接配置redis:host: redis.prod.clusterport: 6379password: ${REDIS_PASSWORD}

三、生產級特性實現

3.1 方法級 TTL 控制

實現方式1:語法約定

語法約定

@Cacheable("熱點數據#600") // 600秒過期
public HotData getHotData(String key) {// 業務邏輯
}

TTL 解析實現

public class CacheConfig {@Beanpublic CacheManagerCustomizer<RedisCacheManager> redisCacheCustomizer() {return manager -> manager.setCacheDecorator((name, config) -> {String[] parts = name.split("#");if (parts.length > 1) {Duration ttl = Duration.ofSeconds(Long.parseLong(parts[1]));return new RedisCacheWrapper(parts[0], config.entryTtl(ttl));}return new RedisCacheWrapper(name, config);});}
}
實現方式2:自定義注解+AOP切面
  • 定義自定義注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CacheCustomTtl {long value();      // 緩存時間(秒)long jitter() default 10; // 抖動范圍(秒)//....自定義其他邏輯
}
  • aop切面邏輯
@Aspect
@Component
public class CacheTtlAspect {@Around("@annotation(cacheCustomTtl)")public Object applyCustomTtl(ProceedingJoinPoint joinPoint, CacheCustomTtl cacheCustomTtl) throws Throwable {// 獲取原始緩存配置Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();Cacheable cacheable = method.getAnnotation(Cacheable.class);String[] cacheNames = cacheable.value();// 生成帶自定義時間的緩存名稱(例如: user#3600)String newCacheName = cacheNames[0] + "#" + cacheCustomTtl.value();String[] modifiedCacheNames = {newCacheName};// 動態修改緩存名稱Cacheable modifiedCacheable = new CacheableWrapper(cacheable, modifiedCacheNames);((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(Cacheable.class).value();// 通過反射調用原方法(需使用動態代理或工具類)return joinPoint.proceed();}// 包裝類用于動態修改注解屬性private static class CacheableWrapper implements Cacheable {private final Cacheable delegate;private final String[] cacheNames;public CacheableWrapper(Cacheable delegate, String[] cacheNames) {this.delegate = delegate;this.cacheNames = cacheNames;}@Overridepublic String[] value() { return cacheNames; }// 其他方法委托給原注解...}
}

3.2 隨機抖動(Jitter)

防雪崩配置

spring:cache:jitter-range: 60s # 最大抖動時間范圍

抖動值生成邏輯

private Duration applyJitter(Duration ttl) {long jitter = ThreadLocalRandom.current().nextLong(spring.cache.jitter-range.getSeconds() + 1);return ttl.plusSeconds(jitter);
}

四、高級優化方案

4.1 多級緩存架構

命中
未命中
未命中
業務層
本地緩存
Redis集群
數據庫

實現要點

  • 使用 Caffeine 作為一級緩存
  • Redis 作為二級緩存
  • 自定義 CacheManager 實現分級策略

基于Spring Boot的多級緩存架構實現

4.2 監控與治理

Spring Boot Actuator 集成

management:endpoints:web:exposure:include: caches,health,metrics

關鍵監控指標

  • ?cache.gets?:緩存查詢次數
  • ?cache.puts?:緩存寫入次數
  • ?cache.removals?:緩存清除次數
  • ?cache.evictions?:緩存淘汰次數

五、最佳實踐總結

5.1 配置推薦

# 生產環境推薦配置
spring:cache:type: redisjitter-range: 30skey-separator: "::"redis:lettuce:pool:max-active: 20max-idle: 10min-idle: 5

5.2 避坑指南

  1. 鍵設計原則

    • 使用業務語義明確的鍵命名(如 user:profile:{userId}?)
    • 避免使用可變對象作為鍵
  2. 緩存穿透防護

    @Cacheable(value = "users", unless = "#result == null")
    public User getUser(Long id) {// 返回null時自動跳過緩存
    }
    
  3. 版本兼容策略

    @CachePut(value = "products#3600", key = "#product.id")
    public Product updateProduct(Product product) {// 更新后自動刷新緩存
    }
    

最后

根據業務場景靈活選擇適合的緩存策略,從簡單的內存緩存到復雜的分布式緩存體系,Spring Boot 的緩存抽象層始終提供一致的使用體驗。記住:沒有完美的緩存方案,只有最適合業務場景的緩存策略。

?

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

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

相關文章

蘋果Siri升級遇阻,國行iPhone或將引入阿里、百度AI自救

AI整合進展緩慢 蘋果正加速將生成式AI技術整合至Siri&#xff0c;但內部消息稱其底層技術研發落后于競爭對手&#xff0c;進展未達預期。 國行iPhone將引入雙AI模型 蘋果計劃在2025年中期為國行iPhone引入AI功能&#xff0c;目前已敲定與 阿里巴巴、百度 合作&#xff0c;用戶…

阿里推出全新推理模型(因果語言模型),僅1/20參數媲美DeepSeek R1

阿里Qwen 團隊正式發布了他們最新的研究成果——QwQ-32B大語言模型&#xff01;這款模型不僅名字萌萌噠(QwQ)&#xff0c;實力更是不容小覷&#xff01;&#x1f60e; QwQ-32B 已在 Hugging Face 和 ModelScope 開源&#xff0c;采用了 Apache 2.0 開源協議。大家可通過 Qwen C…

TomcatServlet

https://www.bilibili.com/video/BV1UN411x7xe tomcat tomcat 架構圖&#xff0c;與 jre&#xff0c;應用程序之前的關系 安裝使用 tomcat 10 開始&#xff0c;api 從 javax.* 轉為使用 jakarta.*&#xff0c;需要至少使用 jdk 11 cmd 中默認 gbk 編碼&#xff0c;解決控制…

JDK ZOOKEEPER KAFKA安裝

JDK17下載安裝 mkdir -p /usr/local/develop cd /usr/local/develop 將下載的包上傳服務器指定路徑 解壓文件 tar -zxvf jdk-17.0.14_linux-x64_bin.tar.gz -C /usr/local/develop/ 修改文件夾名 mv /usr/local/develop/jdk-17.0.14 /usr/local/develop/java17 配置環境變量…

高考數學。。。

2024上 具體來說&#xff0c;直線的參數方程可以寫為&#xff1a; x1t y?t z1t 二、簡答題(本大題共5小題&#xff0c;每小題7分&#xff0c;共35分。) 12.數學學習評價不僅要關注結果評價&#xff0c;也要關注過程評價。簡要說明過程評價應關注哪幾個方面。…

C# 實現鼠標軌跡錄制與回放自動化功能(附源碼)

在軟件自動化測試或者重復性辦公任務中&#xff0c;鼠標操作的自動化可以大大減少人工干預&#xff0c;提高工作效率。這里將詳細介紹如何使用 C# 實現鼠標軌跡的錄制與回放功能&#xff0c;代碼結構清晰&#xff0c;具有較強的擴展性。 引用 NuGet 包 在開發這個功能時&…

Nacos 核心功能實戰筆記(超詳細)

Nacos 核心功能實戰筆記 一、Nacos 簡介 1. 是什么&#xff1f; 全稱&#xff1a;Nacos Naming and Configuration Service定位&#xff1a;阿里巴巴開源的 動態服務發現、配置管理、服務管理平臺核心功能&#xff1a;服務注冊與發現 統一配置管理 服務健康監測適用場景&…

安裝remixd,在VScode創建hardhat

在終端&#xff0c;以管理員身份&#xff0c;cmd 需要科學上網 npm install -g remix-project/remixd 在vscode插件中&#xff0c;安裝solidity插件&#xff0c;是暗灰色那款 1.將nodeJs的版本升級至18以上 2.在vscode打開一個新的文件&#xff0c;在終端輸入 npx hardhat 3.…

unity pico開發 四 物體交互 抓取 交互層級

文章目錄 手部設置物體交互物體抓取添加抓取抓取三種類型抓取點偏移抓取事件抓取時不讓物體吸附到手部 射線抓取交互層級 手部設置 為手部&#xff08;LeftHandController&#xff09;添加XRDirInteractor腳本 并添加一個球形碰撞盒&#xff0c;勾選isTrigger,調整大小為0.1 …

CyberRT(apollo) 定時器模塊簡述及bug分析

timer 模塊 timer的定義&#xff0c;cyberrt中timer模塊用于設置定時器任務&#xff0c;字面意思&#xff0c;設置設置定時周期及出發頻次&#xff08;周期 or oneshot)&#xff0c;到達指定時間時間觸發callback time wheel 時鐘節拍輪&#xff0c;常見的定時器設計&#x…

java八股文之消息中間件

1.RabbitMQ如何保證消息不丟失 開啟生產者確認機制&#xff0c;確保生產者的消息能到達隊列開啟持久化功能&#xff0c;確保消息未消費前在隊列中不會丟失&#xff08;交換機&#xff0c;隊列&#xff0c;消息都需要開啟持久化功能&#xff09;開啟消費者確認機制為auto,由spr…

Win7重裝不翻車!ISO鏡像安全下載渠道+BIOS設置避雷手冊

一、寫在前面&#xff1a;為什么你需要這份教程&#xff1f; 當電腦頻繁藍屏、系統崩潰甚至無法開機時&#xff0c;重裝系統可能是最后的救命稻草。但市面上的教程往往存在三大痛點&#xff1a; ?? 鏡像來源不明導致系統被植入后門 ?? 啟動盤制作失敗反復折騰 ?? 操作失…

大學至今的反思與總結

現在是2025年的3月5日&#xff0c;我大三下學期。 自大學伊始&#xff0c;我便以考研作為自己的目標&#xff0c;有時還會做自己考研上岸頭部985,211&#xff0c;offer如潮水般涌來的美夢。 但是我卻忽略了一點&#xff0c;即便我早早下定了決心去考研&#xff0c;但并沒有早…

SpringBoot 全局異常處理

文章目錄 異常處理全局異常處理(推薦)局部異常處理高級技巧設置返回狀態碼處理404異常異常處理 全局異常處理(推薦) 創建一個全局異常處理類,使用 @RestControllerAdvice 注解標記。 在方法上使用 @ExceptionHandler 聲明當前方法可處理的異常類型。當系統發生異常時,…

【四.RAG技術與應用】【11.阿里云百煉應用(上):RAG在云端的實踐】

一、為什么需要RAG?大模型的“知識困境”與破局之道 大模型雖然“博學”,但它的知識庫存在兩個致命短板: 缺乏私有知識:比如企業內部的產品手冊、客戶數據、行業報告等;知識更新滯后:大模型的訓練數據往往停留在某個時間點,無法實時獲取最新信息(比如今天的股票行情或…

使用wifi連接手機adb進行調試|不使用數據線adb調試手機|找應用錯誤日志和操作日志

手機在開發者選項里要開啟無線調試 在手機設置中查看WiFi的IP地址 設置 -> WLAN -> 已連接的WiFi -> IP地址 使用手機的IP地址連接 adb connect 192.168.1.12:xxxxx 檢查連接狀態 adb devices 斷開特定設備 adb disconnect 192.168.x.x:xxxxx 斷開所有設備 …

mapbox高階,結合threejs(threebox)添加三維球體

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.2 ??mapboxgl.Map style屬性1.3 ??threebox Sphere靜態對象二、??使用t…

游戲引擎學習第140天

回顧并為今天的內容做準備 目前代碼的進展到了聲音混音的部分。昨天我詳細解釋了聲音的處理方式&#xff0c;聲音在技術上是一個非常特別的存在&#xff0c;但在游戲中進行聲音混音的需求其實相對簡單明了&#xff0c;所以今天的任務應該不會太具挑戰性。 今天我們會編寫一個…

golang并發編程如何學習

《掌握 Golang 并發編程的通關秘籍》 在當今的編程世界中&#xff0c;Golang 并發編程正以其獨特的魅力和強大的能力吸引著眾多開發者。然而&#xff0c;對于許多小伙伴來說&#xff0c;如何學好這門技術卻成了一個頭疼的問題。別擔心&#xff0c;今天就讓我來為大家揭開 Gola…

SpringMVC學習(controller層加載控制與(業務、功能)bean加載控制、Web容器初始化配置類)(3)

目錄 一、SpringMVC、Spring的bean加載控制。 &#xff08;1&#xff09;實際開發的包結構層次。 &#xff08;2&#xff09;如何"精準"控制兩個容器分別加載各自bean。(分析) <1>SpringMVC相關bean加載控制。(方法) <2>Spring相關bean加載控制。(方法) …