2.Spring Boot中集成Guava Cache或者Caffeine

一、在Spring Boot(1.x版本)中集成Guava Cache

  • 注意: Spring Boot 2.x+用戶:優先使用Caffeine,性能更優且維護活躍。

1. 添加依賴

pom.xml中添加Guava依賴:

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.0.1-jre</version> <!-- 使用最新版本 -->
</dependency>

2. 啟用緩存支持

在啟動類上添加@EnableCaching注解:

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

3. 配置Guava緩存管理器

創建配置類定義CacheManager Bean:

@Configuration
public class CacheConfig {@Beanpublic CacheManager cacheManager() {GuavaCacheManager cacheManager = new GuavaCacheManager();cacheManager.setCacheBuilder(CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES) // 寫入10分鐘后過期.maximumSize(100) // 最大緩存數量.recordStats()); // 開啟統計信息return cacheManager;}
}

4. 使用緩存注解

在Service層使用@Cacheable@CacheEvict等注解:

@Service
public class UserService {// 緩存查詢結果,key為id@Cacheable(value = "USER_CACHE", key = "#id")public User getUserById(Long id) {return userRepository.findById(id).orElse(null);}// 更新緩存@CachePut(value = "USER_CACHE", key = "#user.id")public User updateUser(User user) {return userRepository.save(user);}// 刪除緩存@CacheEvict(value = "USER_CACHE", key = "#id")public void deleteUser(Long id) {// 刪除用戶邏輯userRepository.deleteById(id);}}

5. 驗證緩存效果

編寫測試類或調用接口驗證緩存是否生效:

@SpringBootTest
public class UserServiceTest {@Autowiredprivate UserService userService;@Testpublic void testCache() {// 第一次調用,執行方法User user1 = userService.getUserById("123");// 第二次調用,從緩存獲取User user2 = userService.getUserById("123");// 驗證是否為同一對象(緩存生效)assertThat(user1).isSameAs(user2);}
}

高級配置

  • 多緩存配置:為不同緩存設置不同策略:

    @Bean
    public CacheManager cacheManager() {GuavaCacheManager cacheManager = new GuavaCacheManager();cacheManager.setCacheBuilder(CacheBuilder.newBuilder().expireAfterWrite(30, TimeUnit.MINUTES).maximumSize(500));cacheManager.setCacheBuilder("userCache", CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES).maximumSize(100));return cacheManager;
    }
    
  • 刷新策略:使用refreshAfterWrite定時刷新(需配合LoadingCache):

    CacheBuilder.newBuilder().refreshAfterWrite(5, TimeUnit.MINUTES).build(CacheLoader.from(key -> loadData(key)));
    
  • 統計信息:通過recordStats()啟用統計,使用cache.getStatistics()獲取命中率等信息。

常見問題

  1. 緩存未生效

    • 確保啟動類有@EnableCaching
    • 檢查方法是否為public(注解在私有方法上無效)。
  2. 配置未應用

    • 確認CacheManager Bean正確注冊。
    • 檢查緩存名稱是否匹配@Cacheable(value = "cacheName")
  3. 內存溢出

    • 合理設置maximumSizeexpireAfterAccess/Write

通過以上步驟,即可在Spring Boot中高效使用Guava Cache實現本地緩存,提升應用性能。



二、Spring Boot 2.x及以上版本(推薦使用Caffeine)

在Spring Boot 2.x及以上版本中,Caffeine作為默認的本地緩存組件,取代了Guava Cache,提供了更高的性能和更靈活的配置。


1. 添加依賴

需引入spring-boot-starter-cachecaffeine依賴:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.1.8</version> <!-- 推薦使用最新版本 -->
</dependency>

2. 啟用緩存支持

在啟動類添加@EnableCaching注解:

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

3. 配置Caffeine緩存

方式一:通過配置文件

application.yml中定義全局緩存參數:

spring:cache:type: caffeinecaffeine:spec: maximumSize=500,expireAfterWrite=600s,initialCapacity=100cache-names: userCache, productCache  # 定義緩存名稱
  • 常用參數
    • maximumSize:最大緩存條目數
    • expireAfterWrite:寫入后過期時間
    • initialCapacity:初始容量。
方式二:通過Java Config類

為不同緩存設置獨立策略(推薦多緩存場景):

@Configuration
@EnableCaching
public class CacheConfig {public enum Caches {USER_CACHE(600, 1000),  // 有效期600秒,最大容量1000PRODUCT_CACHE(3600);private final int ttl;private final int maxSize;Caches(int ttl, int maxSize) {this.ttl = ttl;this.maxSize = maxSize;}public int getTtl() {return ttl;}public int getMaxSize() {return maxSize;}}@Beanpublic CacheManager cacheManager() {SimpleCacheManager manager = new SimpleCacheManager();List<CaffeineCache> caches = Arrays.stream(Caches.values()).map(c -> new CaffeineCache(c.name(), Caffeine.newBuilder().expireAfterWrite(c.getTtl(), TimeUnit.SECONDS).maximumSize(c.getMaxSize()).build())).collect(Collectors.toList());manager.setCaches(caches);return manager;}
}

此方式支持為每個緩存單獨配置過期時間和容量。


4. 使用緩存注解

在Service層通過注解操作緩存:

@Service
public class UserService {// 緩存查詢結果,key為id@Cacheable(value = "USER_CACHE", key = "#id")public User getUserById(Long id) {return userRepository.findById(id).orElse(null);}// 更新緩存@CachePut(value = "USER_CACHE", key = "#user.id")public User updateUser(User user) {return userRepository.save(user);}// 刪除緩存@CacheEvict(value = "USER_CACHE", key = "#id")public void deleteUser(Long id) {userRepository.deleteById(id);}
}
  • 注解說明
    • @Cacheable:查詢時優先從緩存讀取
    • @CachePut:更新數據并刷新緩存
    • @CacheEvict:刪除數據時移除緩存。

5. 高級配置

刷新策略(RefreshAfterWrite)

需定義CacheLoader以支持自動刷新:

@Bean
public CacheLoader<Object, Object> cacheLoader() {return new CacheLoader<>() {@Overridepublic Object load(Object key) {return loadDataFromDB(key);  // 初始加載數據}@Overridepublic Object reload(Object key, Object oldValue) {return oldValue;  // 刷新時保留舊值,異步加載新值}};
}

配置文件中需添加refreshAfterWrite=5s,并關聯此Bean。

統計與監控

啟用統計功能:

Caffeine.newBuilder().recordStats().build();

通過cache.stats()獲取命中率、回收數量等指標。


6. 驗證緩存效果

通過測試類驗證緩存是否生效:

@SpringBootTest
public class CacheTest {@Autowiredprivate UserService userService;@Testpublic void testCache() {User user1 = userService.getUserById(1L);  // 首次查詢,存入緩存User user2 = userService.getUserById(1L);  // 二次查詢,命中緩存assertThat(user1).isSameAs(user2);}
}

常見問題

  1. 緩存未命中

    • 檢查方法是否為public(注解在私有方法無效)
    • 確認緩存名稱與配置一致。
  2. 配置沖突

    • 避免同時配置maximumSizemaximumWeight
    • expireAfterWrite優先級高于expireAfterAccess

通過以上步驟,可在Spring Boot 2.x中高效集成Caffeine,實現高性能本地緩存,適用于高頻訪問但更新較少的數據場景(如配置信息、靜態數據)。



三、Caffeine使用場景

Caffeine 作為高性能本地緩存庫,適用于多種需要快速數據訪問和高效內存管理的場景。以下是其主要使用場景及對應的技術優勢分析:


1. 高并發請求緩存

  • 場景描述:適用于高頻訪問的接口或熱點數據,例如用戶信息查詢、商品詳情展示等。Caffeine 通過無鎖并發設計和 Window TinyLFU 算法,顯著提升緩存命中率,減少數據庫壓力。
  • 技術優勢
    • 高性能:在高并發環境下,Caffeine 的吞吐量遠超 Guava Cache,其分段鎖機制避免了鎖競爭問題。
    • 高命中率:Window TinyLFU 算法結合 LRU 和 LFU 優點,有效保留高頻訪問數據,命中率比 Guava 提升 10%~20%。
  • 典型應用:Web 應用的 API 接口緩存,如電商平臺的商品詳情頁。

2. 數據庫查詢緩存

  • 場景描述:用于緩存頻繁查詢的數據庫結果,如用戶常用配置、熱門商品庫存等,減少重復數據庫訪問。
  • 技術優勢
    • 自動過期策略:支持 expireAfterWrite(寫入后過期)和 expireAfterAccess(訪問后過期),防止數據過時。
    • 內存管理:通過 maximumSize 限制緩存條目數,避免內存溢出,結合惰性刪除和定時清理機制優化內存使用。
  • 典型應用:用戶登錄信息緩存、商品庫存實時查詢緩存。

3. 復雜計算結果緩存

  • 場景描述:緩存計算密集型操作的結果,如圖像處理、大數據聚合分析等,避免重復計算消耗資源。
  • 技術優勢
    • 異步加載:通過 AsyncLoadingCache 異步加載數據,減少主線程阻塞,提升系統響應速度。
    • 刷新機制:使用 refreshAfterWrite 定時刷新緩存,保證數據更新后的及時性,同時保留舊數據直至新數據加載完成。
  • 典型應用:推薦系統的實時計算結果緩存、圖像處理后的縮略圖緩存。

4. 多級緩存架構(L1緩存)

  • 場景描述:在分布式系統中作為一級本地緩存(L1),結合 Redis(L2)和數據庫(L3)形成三級緩存,減少跨服務或跨節點的網絡延遲。
  • 技術優勢
    • 低延遲訪問:本地內存訪問速度極快,適合對延遲敏感的場景。
    • 靈活集成:通過 CacheLoaderWriter 接口,可無縫與 Redis 等外部緩存聯動,實現數據回源和同步。
  • 典型應用:秒殺系統的庫存緩存、分布式服務中的配置信息緩存。

5. 需要高靈活性和統計監控的場景

  • 場景描述:對緩存策略有定制化需求(如動態調整過期時間、監聽緩存事件)或需監控緩存命中率的場景。
  • 技術優勢
    • 靈活配置:支持基于大小、時間、引用等多種淘汰策略,并可自定義過期邏輯。
    • 統計功能:通過 recordStats() 啟用統計,獲取命中率、淘汰次數等指標,便于性能調優。
  • 典型應用:實時監控系統的緩存健康狀態、需要動態調整緩存策略的業務場景。

注意事項

  1. 非分布式場景:Caffeine 僅適用于本地緩存,跨節點數據需結合 Redis 等分布式緩存。
  2. 內存限制:需根據應用內存合理設置 maximumSize 或權重,避免 OOM 問題。
  3. 數據一致性:本地緩存可能導致多實例間數據不一致,需通過過期時間或事件通知機制解決。

總結

Caffeine 憑借其高性能、高命中率和靈活的配置,成為高并發、低延遲場景下的首選本地緩存庫。尤其適合作為一級緩存與 Redis 等組成多級緩存架構,或用于需要快速響應和復雜策略管理的業務場景。實際應用中需結合具體需求調整淘汰策略和內存配置,以最大化其優勢。

更多用法:

SpringBoot:第五篇 集成Guava(本地緩存+分布式緩存)

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

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

相關文章

黑馬點評day02(緩存)

2、商戶查詢緩存 2.1 什么是緩存? 前言:什么是緩存? 就像自行車,越野車的避震器 舉個例子:越野車,山地自行車,都擁有"避震器",防止車體加速后因慣性,在酷似"U"字母的地形上飛躍,硬著陸導致的損害,像個彈簧一樣; 同樣,實際開發中,系統也需要"避震…

頭歌禁止復制怎么解除(簡單版)

被頭歌數據庫作業禁止復制整神之后&#xff0c;主啵嘗試網上各種解除方法&#xff0c;最后發現一個最簡單且最快速的解除方法。 在瀏覽器中搜索萬能復制插件 下載完成之后就可以隨便復制粘貼啦 超簡單 下載只需幾秒

【無基礎】小白解決Docker pull時報錯:https://registry-1.docker.io/v2/

Docker Compose 啟動失敗問題解決方案 錯誤描述 執行 docker compose up -d 時出現以下錯誤&#xff1a; [] Running 9/9? api Error context canceled …

【數據結構】二叉樹、堆

文章目錄 二叉樹的概念及結構定義特殊的二叉樹核心性質存儲方式 二叉樹的鏈式存儲前序遍歷中序遍歷后序遍歷層序遍歷 二叉樹的順序存儲父子關系的推導堆&#xff08;heap&#xff09;堆的概念向上調整算法和向下調整算法向上調整算法向下調整算法 堆的創建堆的插入堆的刪除 堆的…

Vue3響應式原理那些事

文章目錄 1 響應式基礎:Proxy 與 Reflect1.1 Proxy 代理攔截1.2 Reflect 確保 `this` 指向正確1.2.1 修正 `this` 指向問題1.2.2 統一的操作返回值1.3 與 Vue2 的對比2 依賴收集與觸發機制2.1 全局依賴存儲結構:WeakMap → Map → Set2.2 依賴收集觸發時機2.3 依賴收集核心實…

精選10個好用的WordPress免費主題

10個好用的WordPress免費主題 1. Astra Astra 是全球最受歡迎的WordPress免費主題。它功能豐富&#xff0c;易于使用&#xff0c;SEO友好&#xff0c;是第一個安裝量突破100萬的非默認主題&#xff0c;并獲得了5000多個五星好評。 它完美集成了Elementor、Beaver&#xff0c;…

【SaaS多租架構】數據隔離與性能平衡

SaaS多租戶架構:數據隔離與性能平衡 一、技術背景及發展二、技術特點:數據隔離與性能優化的雙核心三、技術細節:實現路徑與關鍵技術四、實際案例分析五、未來發展趨勢結語一、技術背景及發展 多租戶架構是云計算與SaaS(軟件即服務)模式的核心技術,其核心目標是通過共享基…

部署GM DC Monitor 一體化監控預警平臺

1&#xff09;首先在官網下載鏡像文件 廣目&#xff08;北京&#xff09;軟件有限公司廣目&#xff08;北京&#xff09;軟件有限公司https://www.gm-monitor.com/col.jsp?id1142&#xff09;其次進行部署安裝&#xff0c;教程如下&#xff1a; 1. 基礎環境要求 1) 系統&…

Webug4.0靶場通關筆記15- 第19關文件上傳(畸形文件)

目錄 第19關 文件上傳(畸形文件) 1.打開靶場 2.源碼分析 &#xff08;1&#xff09;客戶端源碼 &#xff08;2&#xff09;服務器源碼 3.滲透實戰 &#xff08;1&#xff09;構造腳本 &#xff08;2&#xff09;雙寫繞過 &#xff08;3&#xff09;訪問腳本 本文通過《…

架構思維:構建高并發讀服務_熱點數據查詢的架構設計與性能調優

文章目錄 一、引言二、熱點查詢定義與場景三、主從復制——垂直擴容四、應用內前置緩存4.1 容量上限與淘汰策略4.2 延遲刷新&#xff1a;定期 vs. 實時4.3 逃逸流量控制4.4 熱點發現&#xff1a;被動 vs. 主動 五、降級與限流兜底六、前端&#xff0f;接入層其他應對七、模擬壓…

寶塔面板運行docker的jenkins

1.在寶塔面板裝docker&#xff0c;以及jenkins 2.ip:端口訪問jenkins 3.獲取密鑰&#xff08;點擊日志&#xff09; 4.配置容器內的jdk和maven環境&#xff08;直接把jdk和maven文件夾放到jenkins容器映射的data文件下&#xff09; 點擊容器-->管理-->數據存儲卷--.把相…

C語言 ——— 函數

目錄 函數是什么 庫函數 學習使用 strcpy 庫函數 自定義函數 寫一個函數能找出兩個整數中的最大值 寫一個函數交換兩個整型變量的內容 牛刀小試 寫一個函數判斷一個整數是否是素數 寫一個函數判斷某一年是否是閏年 寫一個函數&#xff0c;實現一個整型有序數組的二分…

筆記本電腦升級計劃(2017———2025)

ThinkPad T470 (2017) vs ThinkBook 16 (2025) 完整性能對比報告 一、核心硬件性能對比 1. CPU性能對比&#xff08;i5-7200U vs Ultra9-285H&#xff09; 參數i5-7200U (2017)Ultra9-285H (2025)提升百分比核心架構2核4線程 (Skylake)16核16線程 (6P8E2LPE)700%核心數制程工…

具身系列——PPO算法實現CartPole游戲(強化學習)

完整代碼參考&#xff1a; https://gitee.com/chencib/ailib/blob/master/rl/ppo_cartpole.py 執行結果&#xff1a; 部分訓練得分&#xff1a; (sd) D:\Dev\traditional_nn\feiai\test\rl>python ppo_cartpole_v2_succeed.py Ep: 0 | Reward: 23.0 | Running: 2…

Python項目源碼60:電影院選票系統1.0(tkinter)

1.功能特點&#xff1a;通常選票系統應該允許用戶選擇電影、場次、座位&#xff0c;然后顯示總價和生成票據。好的&#xff0c;我得先規劃一下界面布局。 首先&#xff0c;應該有一個電影選擇的列表&#xff0c;可能用下拉菜單Combobox來實現。然后場次時間&#xff0c;可能用…

【全隊項目】智能學術海報生成系統PosterGenius--圖片布局生成模型LayoutPrompt(2)

&#x1f308; 個人主頁&#xff1a;十二月的貓-CSDN博客 &#x1f525; 系列專欄&#xff1a; &#x1f3c0;大模型實戰訓練營_十二月的貓的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻擋不了春天的腳步&#xff0c;十二點的黑夜遮蔽不住黎明的曙光 目錄 1. 前…

Linux的時間同步服務器(附加詳細實驗案例)

一、計時方式的發展 1.古代計時方式? 公元前約 2000 年&#xff1a;古埃及人利用光線留下的影子計時&#xff0c;他們修建高聳的大型方尖碑&#xff0c;通過追蹤方尖碑影子的移動判斷時間&#xff0c;這是早期利用自然現象計時的典型方式 。?商朝時期&#xff1a;人們開發并…

【無需docker】mac本地部署dify

環境安裝準備 #安裝 postgresql13 brew install postgresql13 #使用zsh的在全局添加postgresql命令集 echo export PATH"/usr/local/opt/postgresql13/bin:$PATH" >> ~/.zshrc # 使得zsh的配置修改生效 source ~/.zshrc # 啟動postgresql brew services star…

(5)概述 QT 的元對象系統里的類的調用與聯系,及訪問接口

&#xff08;1&#xff09; QT 的元對象系統&#xff0c;這幾個字大家都知道&#xff0c;那么 QT 的元對象系統里都包含哪些內容呢&#xff0c;其訪問接口是如何呢&#xff1f; 從 QObject 類的實現里&#xff0c;從其數據成員里就可以看出來&#xff1a; QT 里父容器可以釋放其…

打包 Python 項目為 Windows 可執行文件:高效部署指南

Hypackpy 是一款由白月黑羽開發的 Python 項目打包工具&#xff0c;它與 PyInstaller 等傳統工具不同&#xff0c;通過直接打包解釋器環境和項目代碼&#xff0c;并允許開發者修改配置文件以排除不需要的內容&#xff0c;從而創建方便用戶一鍵運行的可執行程序。以下是使用 Hyp…