最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Caffeine 高性能緩存庫詳解與使用案例詳解

 更新時(shí)間:2025年10月09日 10:59:58   作者:Lisonseekpan  
Caffeine是Java生態(tài)中最先進(jìn)的本地緩存庫,其 高性能、低延遲 的設(shè)計(jì)使其成為現(xiàn)代應(yīng)用的首選,通過靈活的配置和強(qiáng)大的統(tǒng)計(jì)功能,開發(fā)者可以輕松實(shí)現(xiàn)高效的緩存策略,顯著提升系統(tǒng)性能,本文介紹Java Caffeine高性能緩存庫詳解與使用案例,感興趣的朋友一起看看吧

Java Caffeine 高性能緩存庫詳解與使用案例

一、Caffeine 簡(jiǎn)介

1.1 什么是 Caffeine?

Caffeine 是一個(gè)基于 Java 8 的高性能本地緩存庫,由 Ben Manes 開發(fā),旨在提供比 Guava Cache 更高效的緩存實(shí)現(xiàn)。其核心特性包括:

  • 基于大小的驅(qū)逐(Size-based Eviction)
  • 基于時(shí)間的過期(Time-based Expiry)
  • 弱引用/軟引用支持
  • 統(tǒng)計(jì)功能(命中率、訪問次數(shù)等)
  • 異步加載(Async Loading)

Caffeine 的設(shè)計(jì)目標(biāo)是最小化延遲和內(nèi)存占用,適用于需要高吞吐量和低延遲的場(chǎng)景(如 Web 應(yīng)用、微服務(wù))。

二、核心特性詳解

2.1 緩存驅(qū)逐策略

2.1.1 基于大小的驅(qū)逐(Size-based Eviction)

Caffeine 使用 Window TinyLFU 算法,動(dòng)態(tài)管理緩存大小,確保最常用的元素保留在緩存中。

Cache<String, String> cache = Caffeine.newBuilder()
.maximumSize(100)// 最大緩存大小為100
.build();
2.1.2 基于時(shí)間的過期
  • 基于訪問時(shí)間(Access Time):元素在最后一次訪問后過期。
  • 基于寫入時(shí)間(Write Time):元素在插入后過期。
Cache<String, String> cache = Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)// 寫入后10分鐘過期
.expireAfterAccess(5, TimeUnit.MINUTES)// 最后一次訪問后5分鐘過期
.build();
2.1.3 弱引用/軟引用
  • 弱引用(Weak Keys/Values):當(dāng) JVM 內(nèi)存不足時(shí)自動(dòng)回收。
  • 軟引用(Soft Values):在 OOM(內(nèi)存溢出)前回收。
Cache<String, String> cache = Caffeine.newBuilder()
.weakKeys()// 鍵使用弱引用
.softValues()// 值使用軟引用
.build();

2.2 統(tǒng)計(jì)功能

Caffeine 提供詳細(xì)的緩存統(tǒng)計(jì)信息,包括命中率、未命中次數(shù)、加載次數(shù)等。

Cache<String, String> cache = Caffeine.newBuilder()
.recordStats()// 啟用統(tǒng)計(jì)
.maximumSize(100)
.build();
// 獲取統(tǒng)計(jì)信息
CacheStats stats = cache.stats();
System.out.println("命中率: " + stats.hitRate());

2.3 異步加載(Async Loading)

通過 AsyncLoadingCache 實(shí)現(xiàn)異步緩存加載,避免阻塞主線程。

AsyncLoadingCache<String, String> asyncCache = Caffeine.newBuilder()
.maximumSize(100)
.buildAsync(key -> {
// 模擬耗時(shí)操作
return CompletableFuture.supplyAsync(() -> fetchFromDB(key));
});
// 獲取緩存(異步)
CompletableFuture<String> future = asyncCache.get("key");

三、使用案例詳解

3.1 單體應(yīng)用緩存

場(chǎng)景:用戶信息緩存
public class UserService {
private final Cache<String, User> userCache = Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
public User getUser(String userId) {
return userCache.get(userId, id -> fetchUserFromDB(id));
}
private User fetchUserFromDB(String id) {
// 模擬數(shù)據(jù)庫查詢
return new User(id, "User_" + id);
}
}
優(yōu)勢(shì):
  • 減少數(shù)據(jù)庫壓力:高頻查詢直接命中緩存。
  • 動(dòng)態(tài)刷新:Caffeine 自動(dòng)管理緩存更新。

3.2 分布式系統(tǒng)中的緩存

場(chǎng)景:分布式緩存同步

Caffeine 本身是本地緩存,但可通過與 Redis 結(jié)合實(shí)現(xiàn)分布式緩存。

public class DistributedCache {
private final Cache<String, String> localCache = Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(5, TimeUnit.MINUTES)
.build();
public String get(String key) {
return localCache.get(key, k -> {
String value = fetchFromRedis(k);
if (value == null) {
value = fetchFromDB(k);
saveToRedis(k, value); // 寫回 Redis
}
return value;
});
}
}
優(yōu)勢(shì):
  • 本地緩存加速:減少對(duì) Redis 的直接訪問。
  • 降級(jí)容錯(cuò):Redis 不可用時(shí)可直接訪問數(shù)據(jù)庫。

3.3 Spring Boot 集成

1. 添加依賴
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>3.1.8</version>
</dependency>
2. 配置緩存
@Configuration
public class CacheConfig {
@Bean
public Cache<String, String> myCache() {
return Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
}
}
3. 使用緩存
@Service
public class MyService {
@Autowired
private Cache<String, String> myCache;
public String getData(String key) {
return myCache.get(key, k -> fetchFromExternalService(k));
}
}

四、性能優(yōu)化技巧

4.1 避免緩存雪崩

  • 隨機(jī)過期時(shí)間:為緩存設(shè)置隨機(jī)過期時(shí)間,避免大量緩存同時(shí)失效。
  • 熱點(diǎn)數(shù)據(jù)預(yù)加載:對(duì)高頻訪問的數(shù)據(jù)主動(dòng)加載到緩存。
// 隨機(jī)過期時(shí)間
Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.scheduler(Scheduler.systemScheduler())
.build();

4.2 緩存命中率優(yōu)化

  • 合理設(shè)置大小:根據(jù)業(yè)務(wù)訪問模式調(diào)整 maximumSize。
  • 監(jiān)控統(tǒng)計(jì):定期分析 hitRate()evictionCount(),調(diào)整策略。

4.3 內(nèi)存管理

  • 軟引用值(softValues):在 JVM 內(nèi)存不足時(shí)自動(dòng)回收緩存。
  • 定期清理:使用 cleanUp() 手動(dòng)觸發(fā)清理。
cache.cleanUp(); // 手動(dòng)清理過期緩存

五、常見問題與解決方案

5.1 緩存穿透(Cache Penetration)

問題:查詢不存在的數(shù)據(jù)導(dǎo)致頻繁訪問數(shù)據(jù)庫。
解決方案

  • 布隆過濾器(Bloom Filter):攔截不存在的鍵。
  • 空值緩存:對(duì)查詢結(jié)果為空的鍵設(shè)置短暫緩存。
String value = cache.get(key, k -> {
String result = fetchFromDB(k);
if (result == null) {
cache.put(k, "");// 緩存空值
}
return result;
});

5.2 緩存擊穿(Cache Breakdown)

問題:熱點(diǎn)數(shù)據(jù)過期后大量請(qǐng)求直接訪問數(shù)據(jù)庫。
解決方案

  • 互斥鎖(Mutex Lock):僅允許一個(gè)線程重建緩存。
  • 永不過期:熱點(diǎn)數(shù)據(jù)設(shè)置永不過期,定時(shí)異步更新。
String value = cache.get(key, k -> {
synchronized (lock) {
if (cache.getIfPresent(k) == null) {
String result = fetchFromDB(k);
cache.put(k, result);
return result;
}
}
return cache.getIfPresent(k);
});

5.3 緩存雪崩(Cache Avalanche)

問題:大量緩存同時(shí)失效,導(dǎo)致數(shù)據(jù)庫壓力激增。
解決方案

  • 隨機(jī)過期時(shí)間:為緩存設(shè)置隨機(jī)過期時(shí)間。
  • 分層緩存:本地緩存 + Redis 分布式緩存。

六、Caffeine 與 Guava Cache 對(duì)比

特性CaffeineGuava Cache
算法Window TinyLFU(高命中率)Window TinyLFU(與 Caffeine 相同)
異步加載支持(AsyncLoadingCache)不支持
統(tǒng)計(jì)功能詳細(xì)統(tǒng)計(jì)(命中率、加載次數(shù)等)基本統(tǒng)計(jì)
性能更高吞吐量和更低延遲稍遜于 Caffeine
維護(hù)狀態(tài)活躍維護(hù)已停止更新

七、總結(jié)

Caffeine 是 Java 生態(tài)中最先進(jìn)的本地緩存庫,其 高性能、低延遲 的設(shè)計(jì)使其成為現(xiàn)代應(yīng)用的首選。通過靈活的配置和強(qiáng)大的統(tǒng)計(jì)功能,開發(fā)者可以輕松實(shí)現(xiàn)高效的緩存策略,顯著提升系統(tǒng)性能。結(jié)合異步加載和分布式緩存方案,Caffeine 能夠滿足從單體應(yīng)用到微服務(wù)架構(gòu)的多樣化需求。

八、參考資料

  • Caffeine 官方文檔:https://github.com/ben-manes/caffeine
  • Java 緩存最佳實(shí)踐:https://www.baeldung.com/java-cache-best-practices
  • Caffeine 與 Redis 集成示例:https://github.com/ben-manes/caffeine-spring-boot-starter

到此這篇關(guān)于Java Caffeine 高性能緩存庫詳解與使用案例的文章就介紹到這了,更多相關(guān)Java Caffeine 高性能緩存庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java泛型的用法及T.class的獲取過程解析

    Java泛型的用法及T.class的獲取過程解析

    這篇文章主要介紹了Java泛型的用法及T.class的獲取過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java的JNI快速入門教程(推薦)

    Java的JNI快速入門教程(推薦)

    下面小編就為大家?guī)硪黄狫ava的JNI快速入門教程(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09
  • Java中接口Set的特點(diǎn)及方法說明

    Java中接口Set的特點(diǎn)及方法說明

    這篇文章主要介紹了Java中接口Set的特點(diǎn)及方法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java中synchronized關(guān)鍵字修飾方法同步的用法詳解

    Java中synchronized關(guān)鍵字修飾方法同步的用法詳解

    synchronized可以用來同步靜態(tài)和非靜態(tài)方法,下面就具體來看一下Java中synchronized關(guān)鍵字修飾方法同步的用法詳解:
    2016-06-06
  • 深入探究Java線程不安全的原因與解決

    深入探究Java線程不安全的原因與解決

    線程不安全這個(gè)問題,一般在學(xué)Java時(shí),我們老師會(huì)讓我們背誦一段長(zhǎng)長(zhǎng)的話。"當(dāng)不同線程同時(shí)能訪問同一個(gè)變量時(shí),可能會(huì)導(dǎo)致線程不安全"。實(shí)際上,這句話重點(diǎn)想突出的只有原子性。而我們往往考慮線程不安全的原因,會(huì)從三方面進(jìn)行考慮:就是原子性,可見性,有序性
    2022-04-04
  • SpringCloud集成zookeeper實(shí)現(xiàn)服務(wù)注冊(cè)并訪問功能

    SpringCloud集成zookeeper實(shí)現(xiàn)服務(wù)注冊(cè)并訪問功能

    zookeeper和eureka一樣,是用于充當(dāng)服務(wù)注冊(cè)功能服務(wù)器的一個(gè)springcloud插件,這篇文章主要介紹了SpringCloud集成zookeeper實(shí)現(xiàn)服務(wù)注冊(cè)并訪問,需要的朋友可以參考下
    2022-06-06
  • Java中g(shù)etParameterTypes()方法的使用與原理分析

    Java中g(shù)etParameterTypes()方法的使用與原理分析

    本文詳細(xì)介紹了Java中g(shù)etParameterTypes()方法的使用方式、工作原理及其在實(shí)際開發(fā)中的應(yīng)用,該方法用于獲取方法的參數(shù)類型列表,并通過反射機(jī)制在運(yùn)行時(shí)動(dòng)態(tài)地獲取這些信息,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • mybatis?傳入null值的解決方案

    mybatis?傳入null值的解決方案

    這篇文章主要介紹了mybatis?傳入null值的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot監(jiān)聽Redis Key過期事件的幾種方式

    SpringBoot監(jiān)聽Redis Key過期事件的幾種方式

    本文介紹了使用Redis監(jiān)聽鍵過期來實(shí)現(xiàn)電商平臺(tái)優(yōu)惠券自動(dòng)失效的解決方案,包括配置Redis、實(shí)現(xiàn)監(jiān)聽器、使用線程池優(yōu)化以及進(jìn)一步優(yōu)化措施,需要的朋友可以參考下
    2026-03-03
  • 鎖超時(shí)發(fā)現(xiàn)parallelStream并行流線程上下文坑解決

    鎖超時(shí)發(fā)現(xiàn)parallelStream并行流線程上下文坑解決

    這篇文章主要為大家介紹了鎖超時(shí)發(fā)現(xiàn)parallelStream并行流線程上下文坑解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08

最新評(píng)論

健康| 新巴尔虎右旗| 新竹市| 轮台县| 合肥市| 乌兰浩特市| 如东县| 长葛市| 元江| 秀山| 灵武市| 常熟市| 武城县| 仁布县| 拉萨市| 罗平县| 宜春市| 湖北省| 东阳市| 搜索| 图木舒克市| 江山市| 绩溪县| 永年县| 哈密市| 济阳县| 姜堰市| 永登县| 旌德县| 玛多县| 定安县| 泰来县| 通江县| 成安县| 邵阳县| 塔城市| 辽阳市| 济阳县| 仁化县| 买车| 兴和县|