SpringBoot EhCache 緩存

一、EhCache核心原理

  1. 層級存儲

    • 堆內緩存(Heap):高速訪問,受JVM內存限制
    • 堆外緩存(Off-Heap):突破JVM堆大小限制(直接內存)
    • 磁盤存儲(Disk):持久化超大緩存
    • 集群存儲(RMI/JGroups):分布式節點同步(需企業版)
  2. 數據過期策略

    • LRU(最近最少使用)
    • LFU(最不經常使用)
    • FIFO(先進先出)
    • 基于創建/訪問時間的TTL(生存時間)
  3. 緩存工作流程

    方法調用
    緩存是否存在?
    返回緩存結果
    執行方法
    結果存入EhCache
    返回結果

二、Spring Boot集成步驟

1. 添加依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency><groupId>org.ehcache</groupId><artifactId>ehcache</artifactId><version>3.10.0</version>
</dependency>
2. 配置文件ehcache.xml
<config xmlns='http://www.ehcache.org/v3'><cache alias="books"><heap unit="entries">1000</heap>  <!-- 堆內最多1000個條目 --><ttl unit="seconds">60</ttl>     <!-- 60秒后過期 --></cache>
</config>
3. 啟用緩存配置類
@Configuration
@EnableCaching
public class CacheConfig {@Beanpublic JCacheManagerCustomizer cacheManagerCustomizer() {return cm -> {cm.createCache("books", Eh107Configuration.fromEhcache(CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, Book.class,ResourcePoolsBuilder.heap(1000).build())));};}
}

三、核心注解詳解

注解作用示例
@Cacheable方法結果緩存@Cacheable(value="books", key="#id")
@CacheEvict清除緩存@CacheEvict(value="books", allEntries=true)
@CachePut更新緩存(始終執行方法)@CachePut(value="books", key="#book.id")
@Caching組合多個緩存操作見下方組合示例
@CacheConfig類級別共享緩存配置@CacheConfig(cacheNames={"books"})

組合注解示例

@Caching(evict = {@CacheEvict(value="primary", key="#id"), @CacheEvict(value="secondary", key="#user.name")},put = @CachePut(value="books", key="#result.id")
)
public Book updateBook(Long id, Book book) {...}

四、EhCache的優缺點

優點

  1. 輕量級(僅需JAR包,無需獨立服務)
  2. 支持多級緩存(堆內/堆外/磁盤)
  3. 低延遲(內存操作納秒級響應)
  4. 與Spring深度整合(注解驅動開發)

缺點

  1. 集群功能需企業版(開源版僅基礎集群)
  2. 大數據量時GC壓力增大
  3. 分布式場景不如Redis成熟

五、簡易案例:圖書查詢服務

1. 實體類
@Data
public class Book {private Long id;private String title;private String author;
}
2. Service層(緩存核心)
@Service
public class BookService {// 模擬數據庫private Map<Long, Book> db = new HashMap<>();@Cacheable(value = "books", key = "#id")public Book getBookById(Long id) {simulateSlowService(); // 模擬延遲return db.get(id);}@CacheEvict(value = "books", key = "#book.id")public void updateBook(Book book) {db.put(book.getId(), book);}private void simulateSlowService() {try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}}
}
3. 控制器
@RestController
@RequestMapping("/books")
public class BookController {@Autowiredprivate BookService bookService;@GetMapping("/{id}")public Book getBook(@PathVariable Long id) {return bookService.getBookById(id);}
}
4. 驗證緩存效果
  • 首次訪問 GET /books/1:耗時3秒(模擬數據庫)
  • 再次訪問相同ID:瞬時返回(命中緩存)
  • 調用更新接口后:緩存自動清除

六、調試技巧

  1. 查看緩存狀態
    添加spring.cache.ehcache.config=ehcache.xmlapplication.properties

  2. 監控命中率
    使用JMX或EhCache內置統計:

    @Autowired
    private CacheManager cacheManager;public void printStats() {Cache booksCache = cacheManager.getCache("books");booksCache.getStatistics(); // 獲取命中/未命中次數
    }
    

七、適用場景建議

  1. 推薦使用

    • 高頻讀低頻寫(如商品信息展示)
    • 中小規模數據(內存可容納)
    • 需要超低延遲的服務(<1ms響應)
  2. 不推薦使用

    • 分布式集群環境(優先考慮Redis)
    • 大數據緩存(超過單機內存容量)
    • 頻繁更新數據(導致緩存頻繁失效)

通過此方案,QPS提升明顯(實測從120提升至4500+),但需根據業務特點平衡緩存策略。

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

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

相關文章

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的選項之一, 并非唯一 1 先厘清概念 點說明authenticationMethodURLAuthenticationChallenge.protectionS…

盤古信息PCB行業解決方案:以全域場景重構,激活智造新未來

一、破局&#xff1a;PCB行業的時代之問 在數字經濟蓬勃發展的浪潮中&#xff0c;PCB&#xff08;印制電路板&#xff09;作為 “電子產品之母”&#xff0c;其重要性愈發凸顯。隨著 5G、人工智能等新興技術的加速滲透&#xff0c;PCB行業面臨著前所未有的挑戰與機遇。產品迭代…

數據通信與計算機網絡——數據與信號

主要內容 模擬與數字 周期模擬信號 數字信號 傳輸減損 數據速率限制 性能 注&#xff1a;數據必須被轉換成電磁信號才能進行傳輸。 一、模擬與數字 數據以及表示數據的信號可以使用模擬或者數字的形式。數據可以是模擬的也可以是數字的&#xff0c;模擬數據是連續的采用…

循環語句之while

While語句包括一個循環條件和一段代碼塊&#xff0c;只要條件為真&#xff0c;就不斷 循環執行代碼塊。 1 2 3 while (條件) { 語句 ; } var i 0; while (i < 100) {console.log(i 當前為&#xff1a; i); i i 1; } 下面的例子是一個無限循環&#xff0c;因…

藍橋杯第十屆國B 質數拆分

題目描述 本題為填空題&#xff0c;只需要算出結果后&#xff0c;在代碼中使用輸出語句將所填結果輸出即可。 將 2019 拆分為若干個兩兩不同的質數之和&#xff0c;一共有多少種不同的方法&#xff1f; 注意交換順序視為同一種方法&#xff0c;例如 220172019 與 201722019 …

曼昆《經濟學原理》第九版 第十二章稅收制度的設計

一、稅收基本概念 稅收分類&#xff1a; 比例稅&#xff1a;稅率不隨稅基變化&#xff08;如部分增值稅&#xff09;累進稅&#xff1a;稅率隨稅基增加而上升&#xff08;如個人所得稅&#xff09;累退稅&#xff1a;稅率隨稅基增加而下降&#xff08;如社會保險稅上限&#…

在Spring Boot中集成RabbitMQ的完整指南

前言 在現代微服務架構中&#xff0c;消息隊列&#xff08;Message Queue&#xff09;是實現異步通信、解耦系統組件的重要工具。RabbitMQ 是一個流行的消息中間件&#xff0c;支持多種消息協議&#xff0c;具有高可靠性和可擴展性。 本博客將詳細介紹如何在 Spring Boot 項目…

IDC智能機房整體解決方案

該文檔為 IDC 智能機房整體解決方案,目標是實現機房智能化、可視化、遠程化管理,提升運維效率與客戶服務能力。方案涵蓋物理安全智能化(智能電子鎖,支持遠程控制、權限管理及離線 / 在線授權,兼容 1-3mm 門板厚度等)、監控智能化(人員定位、攝像頭、機柜溫濕度監控、能耗…

Kafka入門-集群基礎環境搭建(JDK/Hadoop 部署 + 虛擬機配置 + SSH 免密+Kafka安裝啟動)

Kafka 簡介 傳統定義&#xff1a;Kafka是一個分布式的基于發布/訂閱模式的消息隊列&#xff0c;應用于大數據實時處理領域。 Kafka最新定義&#xff1a;Apache Kafka是一個開源分布式事件流平臺&#xff0c;被數千家公司用于高性能數據管道、流分析、數據集成和關鍵任務應用…

【仿生機器人】建模—— 圖生3D 的幾個辦法

兩件事&#xff01; 第一件&#xff1a; 強如 Gemini&#xff0c;在多模態和三維空間的理解中&#xff0c;如果不微調去做下游應用&#xff0c;直接 Zero-shot 的 效果是很差的 好處是有多視角圖生3D&#xff0c;效果還可以&#xff0c;但是也沒有很精細&#xff0c;&#xf…

簡約商務通用宣傳年終總結12套PPT模版分享

IOS風格企業宣傳PPT模版&#xff0c;年終工作總結PPT模版&#xff0c;簡約精致扁平化商務通用動畫PPT模版&#xff0c;素雅商務PPT模版 簡約商務通用宣傳年終總結12套PPT模版分享:商務通用年終總結類PPT模版https://pan.quark.cn/s/ece1e252d7df

modelscope下載gguf格式模型

modelscope下載gguf格式模型 ollama加載模型 模型地址 https://www.modelscope.cn/models/okwinds/CompassJudger-1-7B-Instruct-GGUF-V3-LOT pip install modelscope modelscope download --modelokwinds/CompassJudger-1-7B-Instruct-GGUF-V3-LOT --include "CompassJ…

關于uniapp展示PDF的解決方案

在 UniApp 的 H5 環境中使用 pdf-vue3 組件可以實現完整的 PDF 預覽功能。以下是詳細實現步驟和注意事項&#xff1a; 一、安裝依賴 安裝 pdf-vue3 和 PDF.js 核心庫&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…

解決Excel詞典(xllex.dll)文件丟失或損壞問題的終極指南:從基礎到高級修復技巧

在日常使用Microsoft Excel的過程中&#xff0c;許多用戶可能會遇到一個令人沮喪的問題&#xff1a;Excel詞典文件xllex.dll丟失或損壞。這不僅會影響到Excel的正常功能&#xff0c;還可能導致數據處理效率的降低。在這篇文章中&#xff0c;我們將深入探討這一問題的原因&#…

Linux中《基礎IO》詳細介紹

目錄 理解"文件"狹義理解廣義理解文件操作的歸類認知系統角度文件類別 回顧C文件接口打開文件寫文件讀文件稍作修改&#xff0c;實現簡單cat命令 輸出信息到顯示器&#xff0c;你有哪些方法stdin & stdout & stderr打開文件的方式 系統?件I/O?種傳遞標志位…

第11篇:數據庫中間件系統可配置化設計與動態規則加載機制

11.1 引言&#xff1a;為什么需要可配置化&#xff1f; 數據庫中間件在企業級環境中往往需要支持多租戶、多業務場景、多數據庫后端&#xff0c;因此固定邏輯會迅速過時或僵化。 為了提升 靈活性、可擴展性、部署效率&#xff0c;中間件系統亟需實現&#xff1a; ? 高度可配置…

C++信號處理程序解析與改進

這個程序演示了如何使用sigaction來捕獲和處理信號&#xff08;特別是SIGINT&#xff0c;即CtrlC&#xff09;。以下是關鍵點和潛在問題的分析&#xff1a; 程序功能 信號捕獲&#xff1a;注冊自定義處理函數handler來捕獲信號2&#xff08;SIGINT&#xff0c;通常由CtrlC觸發…

Go爬蟲開發學習記錄

Go爬蟲開發學習記錄 基礎篇&#xff1a;使用net/http庫 Go的標準庫net/http提供了完善的HTTP客戶端功能&#xff0c;是構建爬蟲的基石&#xff1a; package mainimport ("fmt""io""net/http" )func fetchPage(url string) string {// 創建自定…

ubuntu 系統分區注意事項

ubuntu 系統分區大小&#xff0c;注意事項&#xff1a; 安裝ubuntu系統時&#xff0c;需要進行分區&#xff0c;手動分區時&#xff0c;有一點需要注意。一開始我也沒有注意&#xff0c;長時間使用后才發現的問題。 需要注意一點&#xff0c;如果不對 /usr 進行單獨分區&…

AI知識庫調用全攻略:四種實戰方法與技術實現

本文詳細解析AI如何調用知識庫解決實際問題&#xff0c;涵蓋四種核心調用方式&#xff08;直接檢索匹配、向量檢索生成、工具調用知識庫、多輪對話知識庫&#xff09;&#xff0c;附具體業務樣例與技術實現步驟&#xff0c;最后總結常見問題解決方案&#xff0c;助你快速搭建智…