深度解析 Caffeine:高性能 Java 緩存庫

1. Caffeine 簡介

Caffeine 是一個基于 Java 8 的高性能本地緩存庫,由 Ben Manes 開發,旨在替代 Google Guava Cache,提供更優的緩存策略、更高的吞吐量和更靈活的配置。

核心優勢

? 卓越的性能:采用優化的數據結構(如 Window TinyLFU 淘汰算法),減少鎖競爭,提升并發訪問效率。
? 靈活的緩存策略:支持基于大小、時間、權重等多種淘汰機制。
? 豐富的功能:自動刷新、異步加載、批量操作等高級特性。
? 無縫集成 Spring:與 Spring Cache 完美結合,輕松替換 Redis 或 Ehcache。


2. Caffeine 核心機制

2.1 緩存淘汰策略

Caffeine 提供多種緩存淘汰策略,防止內存無限增長:

策略方法說明
基于大小maximumSize(long)限制緩存最大條目數
基于權重maximumWeight(long) + weigher()根據條目權重限制緩存
基于時間expireAfterWrite / expireAfterAccess寫入/訪問后過期
手動淘汰invalidate(key) / invalidateAll()主動移除緩存

2.2 緩存加載方式

Caffeine 支持 同步加載異步加載

// 同步加載(阻塞)
LoadingCache<Key, Value> cache = Caffeine.newBuilder().build(key -> fetchFromDB(key));// 異步加載(非阻塞)
AsyncLoadingCache<Key, Value> asyncCache = Caffeine.newBuilder().buildAsync((key, executor) -> CompletableFuture.supplyAsync(() -> fetchFromDB(key), executor));

2.3 自動刷新機制

refreshAfterWrite 允許緩存條目在寫入后一段時間自動刷新(異步,不阻塞請求):

LoadingCache<String, Data> cache = Caffeine.newBuilder().refreshAfterWrite(1, TimeUnit.MINUTES) // 1分鐘后訪問時觸發刷新.build(this::loadDataFromDB);

注意:刷新時返回舊值,后臺異步加載新值,適合高并發場景。


3. 代碼實戰:Caffeine + Spring Boot

3.1 基礎配置

@Configuration
@EnableCaching
public class CacheConfig {@Beanpublic Caffeine<Object, Object> caffeineConfig() {return Caffeine.newBuilder().maximumSize(1000)          // 最大1000條.expireAfterWrite(10, TimeUnit.MINUTES) // 10分鐘過期.refreshAfterWrite(1, TimeUnit.MINUTES); // 1分鐘后自動刷新}@Beanpublic CacheManager cacheManager(Caffeine<Object, Object> caffeine) {CaffeineCacheManager cacheManager = new CaffeineCacheManager();cacheManager.setCaffeine(caffeine);return cacheManager;}
}

3.2 業務層使用

@Service
public class UserService {@Cacheable(value = "users", key = "#id") // 緩存名稱為 "users"public User getUserById(Long id) {return userRepository.findById(id).orElse(null);}@CacheEvict(value = "users", key = "#id") // 刪除緩存public void deleteUser(Long id) {userRepository.deleteById(id);}
}

4. 高級用法

4.1 多級緩存(Caffeine + Redis)

@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory,Caffeine<Object, Object> caffeine
) {// 本地緩存CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();caffeineCacheManager.setCaffeine(caffeine);// Redis 緩存RedisCacheManager redisCacheManager = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(RedisCacheConfiguration.defaultCacheConfig()).build();// 組合緩存(先查本地,再查Redis)return new CompositeCacheManager(caffeineCacheManager, redisCacheManager);
}

4.2 批量操作優化

public Map<Long, User> batchGetUsers(List<Long> userIds) {// 批量查詢緩存Map<Long, User> cachedUsers = cache.getAll(userIds);// 查找未命中的IDList<Long> missingIds = userIds.stream().filter(id -> !cachedUsers.containsKey(id)).collect(Collectors.toList());if (!missingIds.isEmpty()) {// 從DB加載并更新緩存Map<Long, User> dbUsers = userRepository.batchFindByIds(missingIds);cache.putAll(dbUsers);cachedUsers.putAll(dbUsers);}return cachedUsers;
}

5. 注意事項 & 最佳實踐

5.1 緩存穿透問題

問題:惡意請求不存在的 key,導致頻繁查詢數據庫。
解決方案

.build(key -> {User user = fetchFromDB(key);if (user == null) {return new NullValue(); // 緩存空對象}return user;
});

5.2 緩存雪崩

問題:大量緩存同時失效,導致數據庫壓力激增。
解決方案

.expireAfterWrite(10 + ThreadLocalRandom.current().nextInt(5), TimeUnit.MINUTES) // 隨機過期時間

5.3 內存監控

Caffeine 提供統計信息:

.recordStats() // 啟用統計
CacheStats stats = cache.stats();
System.out.println("命中率: " + stats.hitRate());
System.out.println("加載次數: " + stats.loadCount());

5.4 最佳實踐

? 合理設置緩存大小:避免 OOM(如 maximumSize(10000))。
? 結合 TTL + 自動刷新:保證數據新鮮,同時避免阻塞請求。
? 分布式環境使用多級緩存:本地緩存 + Redis,減少網絡開銷。
? 監控緩存命中率:優化緩存策略,避免緩存失效風暴。


6. 總結

Caffeine 是 Java 生態中最強大的本地緩存庫之一,適用于:

  • 高頻訪問的只讀數據(如配置、用戶信息)
  • 高并發場景(如電商商品詳情頁)
  • 計算成本高的操作(如復雜查詢、API 調用)

通過合理的配置(refreshAfterWrite + expireAfterWrite)和最佳實踐(防穿透、防雪崩),可以極大提升系統性能。

推薦組合

  • 單機應用:純 Caffeine
  • 分布式系統:Caffeine + Redis(多級緩存)

附錄:官方資源

  • GitHub: Caffeine
  • Spring Cache + Caffeine

希望這篇深度解析能幫助你掌握 Caffeine 的核心機制和最佳實踐! 🚀

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

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

相關文章

創客匠人賦能創始人 IP 打造:健康行業知識變現案例深度解析

在知識服務行業蓬勃發展的當下&#xff0c;創始人 IP 打造已成為知識變現的核心驅動力。創客匠人近期披露的陪跑案例顯示&#xff0c;通過系統化的線上線下聯動運營&#xff0c;傳統行業從業者可高效實現 IP 價值轉化。以亓黃中醫科技創始人吳豐言老師為例&#xff0c;其在創客…

64、最小路徑和

題目&#xff1a; 解答&#xff1a; 簡單dp。 定義&#xff1a;dp[i][j]為到達(i,j)所需要的最短路程 初始化&#xff1a;dp[0][0]grid[0][0]&#xff0c;同時對第一行和第一列的&#xff0c;第i個就是前i個之和加上自身 遞歸&#xff1a;dp[i][j]min(dp[i-1][j],dp[i][j-1…

獲取連接通義千問大語言模型配置信息的步驟:api_key、api_url

一、注冊并開通通義千問API服務 1. 注冊阿里云賬號 訪問 阿里云官網點擊右上角"免費注冊"&#xff0c;按指引完成賬號注冊和實名認證 2. 開通通義千問API服務 進入 通義千問API產品頁點擊"立即開通"&#xff0c;按提示完成服務開通&#xff08;部分服務…

汽車加氣站操作工考試題庫含答案【最新】

1.天然氣的主要成分是&#xff08;&#xff09;。 A. 乙烷 B. 乙烯 C. 甲烷 D. 乙炔 答案&#xff1a;C 2.CNG 加氣站中&#xff0c;加氣機的加氣軟管應&#xff08;&#xff09;進行檢查。 A. 每天 B. 每周 C. 每月 D. 每季度 答案&#xff1a;A 3.儲氣罐的安全閥應&#xf…

顯示任何結構的數組對象數據【向上自動滾動】

顯示任何結構的數組對象數據 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>地圖編輯軟件 - 數…

GPIO模式詳解

一、GPIO的八種模式 GPIO支持4種輸入模式&#xff08;浮空輸入、上拉輸入、下拉輸入、模擬輸入&#xff09;和4種輸出模式&#xff08;開漏輸出、開漏復用輸出、推挽輸出、推挽復用輸出&#xff09;。 GPIO_Mode_AIN模擬輸入GPIO_Mode_IN_FLOATING浮空輸入GPIO_Mode_IPD下拉輸…

django rest_framework 自定義403 Forbidden錯誤頁面

django本來有是可以很方便自定義HTTP錯誤頁面的&#xff0c;網上資料一大把。核心是在項目的urls代碼中增加handler403的定義&#xff0c;比如&#xff1a; handler403 "app.views.your_custom_view" 404&#xff0c;500都是一樣的&#xff0c;重新定義handler404…

Kafka Streams架構深度解析:從并行處理到容錯機制的全鏈路實踐

在流處理技術領域&#xff0c;Kafka Streams以其輕量級架構與Kafka生態的深度整合能力脫穎而出。作為構建在Kafka生產者/消費者庫之上的流處理框架&#xff0c;它通過利用Kafka原生的分區、副本與協調機制&#xff0c;實現了數據并行處理、分布式協調與容錯能力的無縫集成。本文…

【嵌入式硬件實例】-555定時器控制舵機/伺服電機

555定時器控制舵機/伺服電機 文章目錄 555定時器控制舵機/伺服電機1、555定時器介紹2、舵機/伺服電機介紹3、硬件準備與接線使用 555 定時器 IC 的伺服電機控制器和測試儀電路是一個簡單的電路,可用于生成操作伺服電機所需的控制信號。該電路允許我們通過按下按鈕手動驅動/控制…

國產麒麟 安裝可視化數據庫軟件DBeaver(圖解)

目錄 ????????編輯DBeaver介紹 官網 通過強制使用 Ubuntu 模板來修復 add-apt-repository 重新添加 PPA 撤銷更改&#xff08;可選&#xff09; 官網直接下載 DBeaver CE 下載好后安裝軟件 啟動方式一 啟動方式二 啟動成功 在左側右擊新建連接 安裝驅動 測…

線程池 JMM 內存模型

線程池 & JMM 內存模型 文章目錄 線程池 & JMM 內存模型線程池線程池的創建ThreadPoolExecutor 七大參數飽和策略ExecutorService 提交線程任務對象執行的方法&#xff1a;ExecutorService 關閉線程池的方法&#xff1a;線程池最大線程數如何確定&#xff1f; volatile…

[論文閱讀] 軟件工程 + 教學 | 軟件工程項目管理課程改革:從傳統教學到以學生為中心的混合式學習實踐

軟件工程項目管理課程改革&#xff1a;從傳統教學到以學生為中心的混合式學習實踐 論文信息 arXiv:2506.14369 Agile and Student-Centred Teaching of Agile/Scrum Concepts Maria Spichkova Comments: Preprint. Accepted to the 29th International Conference on Knowledg…

Windows系統提示“mfc140u.dll丟失”?詳細修復指南,一鍵恢復程序運行!

當你興致勃勃地打開某個游戲或專業軟件時&#xff0c;突然彈出一條錯誤提示——“MFC140u.dll丟失”&#xff0c;程序直接閃退&#xff0c;讓人無比沮喪。別擔心&#xff01;這個問題并不復雜&#xff0c;通常只需重新安裝運行庫或修復系統文件即可解決。本文將為你提供詳細的修…

云XR(AR/VR)算力底座關鍵特征與技術路徑

云XR&#xff08;AR/VR&#xff09;算力底座是支撐擴展現實技術規模化落地的核心基礎設施&#xff0c;當前發展呈現以下關鍵特征與技術路徑&#xff1a; 一、算力架構&#xff1a;云邊端協同異構融合 分布式部署模式? 云端?&#xff1a;承擔高復雜度渲染與大數據處理&#x…

Android開發常用adb合集

Android開發常用adb合集 Android開發常用adb合集crash日志導出 Android開發常用adb合集 crash日志導出 bugreport: adb bugreportdropbox: adb shell dumpsys dropbox --print > desktop/full_dropbox_logs.txt

LTspice仿真4——exp指數函數波形

參數設置 Vinitial&#xff1a;初始電壓值 Vpulsed&#xff1a;脈沖達到值 Rise Delay&#xff1a;上升延遲時間 Rise Tau&#xff1a;上升指數系數tau Fall Delay&#xff1a;下降延遲時間 Fall Tau&#xff1a;下降指數系數tau tau決定指數波形下降或者上升快慢&#x…

[Java 基礎]集合框架

在 Java 中&#xff0c;我們經常需要存儲和操作一組數據&#xff0c;而集合框架就是為此而生。它提供了一套統一的接口和類&#xff0c;幫助我們高效地管理各種數據集合。 常用的集合框架中的類只有 ArrayList、LinkedList、HashSet、HashMap 這 4 個&#xff0c;這些類的繼承…

SQL關鍵字三分鐘入門:WITH —— 公用表表達式讓復雜查詢更清晰

在實際的數據庫開發和分析中&#xff0c;我們常常會遇到復雜的多層嵌套查詢&#xff0c;這樣的 SQL 語句不僅難以閱讀&#xff0c;也容易出錯。 這時候就需要使用一個非常實用又優雅的關鍵字 —— WITH&#xff01; 它可以幫助我們將復雜的子查詢提取出來并命名&#xff0c;從…

要在 Linux 不聯網服務器 上部署并運行 Gitee 上的 vue-vben-admin 項目,并且該項目使用的是 pnpm 管理依賴

目錄 ? 目標&#xff1a;在不聯網服務器中成功運行 vue-vben-admin &#x1f449; 你需要的最終環境&#xff1a; ? 場景&#xff1a;完全離線部署并運行開發/構建環境 &#x1f9f1; 步驟總覽&#xff1a; &#x1f6e0; 詳細操作流程 ? 第 1 步&#xff1a;聯網機器準…

中國風國潮通用PPT模版

中國風答辯總結匯報類通用PPT模版&#xff0c;古風PPT通用模版&#xff0c;國學精品PPT模版&#xff0c;中國風韻PPT模版 中國風國潮通用PPT模版&#xff1a;https://pan.quark.cn/s/59cea717fe8d