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

Caffeine中本地緩存的最佳實(shí)踐與性能優(yōu)化指南

 更新時(shí)間:2025年09月15日 09:43:05   作者:淺沫云歸  
作為 Java 生態(tài)中性能優(yōu)異的本地緩存實(shí)現(xiàn),Caffeine 提供了更高的吞吐量和更低的延遲,本文將深入剖析 Caffeine 的核心原理、源碼實(shí)現(xiàn)和實(shí)際應(yīng)用,希望對(duì)大家有所幫助

技術(shù)背景與應(yīng)用場(chǎng)景

在高并發(fā)分布式系統(tǒng)中,頻繁訪問(wèn)后端數(shù)據(jù)庫(kù)或外部服務(wù)會(huì)成為性能瓶頸,增加延遲并影響用戶體驗(yàn)。作為 Java 生態(tài)中性能優(yōu)異的本地緩存實(shí)現(xiàn),Caffeine 提供了更高的吞吐量和更低的延遲,是替代 Guava Cache 的優(yōu)秀選擇。

常見(jiàn)場(chǎng)景包括:

  • 熱點(diǎn)數(shù)據(jù)或配置數(shù)據(jù)讀取
  • 限流、頻率統(tǒng)計(jì)等短時(shí)緩存需求
  • 在分布式系統(tǒng)中做一級(jí)緩存,減輕二級(jí)緩存或數(shù)據(jù)庫(kù)壓力

本文將深入剖析 Caffeine 的核心原理、源碼實(shí)現(xiàn)和實(shí)際應(yīng)用,并結(jié)合生產(chǎn)環(huán)境實(shí)踐示例,提供駐留內(nèi)存緩存的性能調(diào)優(yōu)建議與最佳實(shí)踐。

核心原理深入分析

1. 數(shù)據(jù)結(jié)構(gòu)與緩存策略

Caffeine 基于 Window TinyLfu(W-TinyLFU)算法,結(jié)合了最近最少使用(LRU)和頻率近似(LFU)兩種思想:

  • Window Cache:近期訪問(wèn)數(shù)據(jù),在一個(gè)小窗口中實(shí)現(xiàn) LRU。新寫入的緩存項(xiàng)先放入窗口,窗口命中后會(huì)提升到主區(qū)域。
  • Main Cache:主區(qū)域維護(hù)大部分常駐緩存,基于 LFU 策略,通過(guò)訪問(wèn)頻率保證熱點(diǎn)數(shù)據(jù)能夠長(zhǎng)期駐留。

該結(jié)構(gòu)使得緩存對(duì)短期熱點(diǎn)長(zhǎng)期熱點(diǎn)都能兼顧,同時(shí)保證淘汰策略的高命中率。

2. 并發(fā)架構(gòu)

Caffeine 使用了分段(Segment)技術(shù),每個(gè) Segment 維護(hù)一個(gè)子緩存,底層依賴UnsafeVarHandle實(shí)現(xiàn)原子操作,替代傳統(tǒng)鎖的性能開(kāi)銷。

  • 無(wú)鎖讀:采用 volatile + CAS 操作進(jìn)行更新。
  • 異步寫:對(duì)于異步加載、刷新和移除操作,統(tǒng)一提交到異步執(zhí)行器,由線程池處理,保證讀路徑低延遲。

3. 異步刷新與寫入

Caffeine 支持:

  • refreshAfterWrite:基于寫入時(shí)間或上次刷新時(shí)間觸發(fā)刷新,將舊值與新值異步切換。
  • expireAfterWrite / expireAfterAccess:按時(shí)間自動(dòng)過(guò)期。

異步刷新使用 ScheduledExecutor 提交任務(wù),避免阻塞業(yè)務(wù)線程。

關(guān)鍵源碼解讀

以下選取 Caffeine 3.x 版本的核心源碼片段進(jìn)行淺析:

// 全局緩存配置構(gòu)建器
Caffeine.newBuilder()
    .initialCapacity(256)
    .maximumSize(10000)
    .expireAfterWrite(Duration.ofMinutes(10))
    .refreshAfterWrite(Duration.ofMinutes(5))
    .recordStats();
  • initialCapacity:預(yù)分配桶大小,避免擴(kuò)容開(kāi)銷。
  • maximumSize:超出后采用 W-TinyLFU 淘汰。
  • expireAfterWrite / refreshAfterWrite:設(shè)置過(guò)期與刷新策略。
  • recordStats:開(kāi)啟統(tǒng)計(jì),用于監(jiān)控緩存命中率與請(qǐng)求延遲。
// 基于 VarHandle 的無(wú)鎖寫入示例
private final VarHandle writeBuffer;

void updateValue(K key, V value) {
    // compareAndSet 保證安全寫入
    writeBuffer.compareAndSet(this, oldValueRef, newValue);
}

原理核心在于使用 VarHandle 實(shí)現(xiàn)字段原子更新,大幅降低鎖競(jìng)爭(zhēng)。Caffeine 在命中路徑幾乎不加鎖,使得高并發(fā)場(chǎng)景下讀性能十分穩(wěn)定。

實(shí)際應(yīng)用示例

以下示例基于 Spring Boot 整合 Caffeine,本地緩存用戶會(huì)話信息。

項(xiàng)目結(jié)構(gòu):

├── pom.xml
├── src/main/java/com/example/cache
│   ├── config/CaffeineCacheConfig.java
│   └── service/UserSessionService.java
└── src/main/resources/application.yml

添加依賴(pom.xml):

<dependencies>
    <dependency>
        <groupId>com.github.ben-manes.caffeine</groupId>
        <artifactId>caffeine</artifactId>
        <version>3.1.6</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
</dependencies>

配置緩存(CaffeineCacheConfig.java):

@Configuration
@EnableCaching
public class CaffeineCacheConfig {

    @Bean
    public CacheManager cacheManager() {
        Caffeine<Object, Object> caffeine = Caffeine.newBuilder()
            .initialCapacity(512)
            .maximumSize(5000)
            .expireAfterWrite(Duration.ofMinutes(30))
            .recordStats();

        CaffeineCacheManager manager = new CaffeineCacheManager("userSessions");
        manager.setCaffeine(caffeine);
        return manager;
    }
}

使用緩存(UserSessionService.java):

@Service
public class UserSessionService {

    @Cacheable(value = "userSessions", key = "#userId")
    public UserSession getSession(String userId) {
        // 模擬從數(shù)據(jù)庫(kù)或遠(yuǎn)程服務(wù)加載會(huì)話
        return loadSessionFromRemote(userId);
    }

    @CacheEvict(value = "userSessions", key = "#userId")
    public void evictSession(String userId) {
        // 手動(dòng)清除緩存
    }
}

應(yīng)用配置(application.yml):

spring:
  cache:
    caffeine:
      spec: "initialCapacity=512,maximumSize=5000,expireAfterWrite=30m,recordStats"

監(jiān)控與統(tǒng)計(jì):

通過(guò) CaffeineCacheManager 返回的 Cache 對(duì)象可以獲取 CacheStats

CaffeineCache cache = (CaffeineCache) cacheManager.getCache("userSessions");
CacheStats stats = cache.getNativeCache().stats();
log.info("Cache hit rate: {}", stats.hitRate());

性能特點(diǎn)與優(yōu)化建議

  • 預(yù)熱和預(yù)加載:系統(tǒng)啟動(dòng)或流量激增前,批量 load 數(shù)據(jù),避免緩存穿透。
  • 合理設(shè)置容量:基于業(yè)務(wù)訪問(wèn)量和內(nèi)存預(yù)算,調(diào)優(yōu) initialCapacitymaximumSize
  • 監(jiān)控指標(biāo):開(kāi)啟 recordStats,持續(xù)關(guān)注命中率、加載時(shí)延和驅(qū)逐率,結(jié)合 Prometheus 采集指標(biāo)。
  • 異步刷新:對(duì)熱點(diǎn)數(shù)據(jù)使用 refreshAfterWrite,確保數(shù)據(jù)實(shí)時(shí)性和低延遲。
  • 結(jié)合分布式方案:本地緩存做一級(jí),二級(jí)使用 Redis 或其他分布式緩存,實(shí)現(xiàn)多級(jí)緩存體系。
  • GC 優(yōu)化:本地緩存對(duì)象較多時(shí),注意堆內(nèi)存分配策略,避免頻繁 Full GC。根據(jù)對(duì)象生命周期調(diào)優(yōu)年輕代/老年代比例。

通過(guò)本文,您可以了解 Caffeine 緩存的核心原理、并發(fā)設(shè)計(jì)及生產(chǎn)環(huán)境最佳實(shí)踐,并結(jié)合示例項(xiàng)目進(jìn)行落地。合理應(yīng)用本地緩存,能夠有效提升系統(tǒng)吞吐量,降低后端壓力,并保障關(guān)鍵業(yè)務(wù)的高可用性。

到此這篇關(guān)于Caffeine中本地緩存的最佳實(shí)踐與性能優(yōu)化指南的文章就介紹到這了,更多相關(guān)Caffeine本地緩存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Java實(shí)現(xiàn)5種負(fù)載均衡算法實(shí)例

    使用Java實(shí)現(xiàn)5種負(fù)載均衡算法實(shí)例

    負(fù)載均衡指由多臺(tái)服務(wù)器以對(duì)稱的方式組成一個(gè)服務(wù)器集合,每臺(tái)服務(wù)器都具有等價(jià)的地位,都可以單獨(dú)對(duì)外提供服務(wù)而無(wú)須其他服務(wù)器的輔助,這篇文章主要給大家介紹了關(guān)于使用Java實(shí)現(xiàn)5種負(fù)載均衡算法的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • 解決json字符串序列化后的順序問(wèn)題

    解決json字符串序列化后的順序問(wèn)題

    這篇文章主要介紹了解決json字符串序列化后的順序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • java計(jì)算兩個(gè)日期中間的時(shí)間

    java計(jì)算兩個(gè)日期中間的時(shí)間

    這篇文章主要介紹了java計(jì)算兩個(gè)日期中間的時(shí)間的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Nacos源碼閱讀方法

    Nacos源碼閱讀方法

    這篇文章將會(huì)帶大家閱讀Nacos源碼以及教大家閱讀源碼的技巧,感興趣的朋友跟隨小編一起看看Nacos源碼閱讀方法
    2022-03-03
  • Java輕量級(jí)權(quán)限認(rèn)證框架Sa-Token的使用

    Java輕量級(jí)權(quán)限認(rèn)證框架Sa-Token的使用

    Sa-Token是一個(gè)輕量級(jí)Java權(quán)限認(rèn)證框架,本文就詳細(xì)的來(lái)介紹一下Java輕量級(jí)權(quán)限認(rèn)證框架Sa-Token的使用,主要解決:登錄認(rèn)證、權(quán)限認(rèn)證、Session會(huì)話、單點(diǎn)登錄、OAuth2.0、微服務(wù)網(wǎng)關(guān)鑒權(quán)等,感興趣的可以了解一下
    2022-03-03
  • Spring Boot Filter 過(guò)濾器的使用方式

    Spring Boot Filter 過(guò)濾器的使用方式

    這篇文章主要介紹了Spring Boot Filter 過(guò)濾器的使用方式,文章通過(guò)圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 一篇文章帶你了解Java基礎(chǔ)-抽象

    一篇文章帶你了解Java基礎(chǔ)-抽象

    這篇文章主要給大家介紹了關(guān)于Java抽象定義以及舉例的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • Eclipse智能提示及快捷鍵

    Eclipse智能提示及快捷鍵

    本文主要介紹了Eclipse智能提示及快捷鍵的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • SpringBoot響應(yīng)出現(xiàn)中文亂碼的解決方法

    SpringBoot響應(yīng)出現(xiàn)中文亂碼的解決方法

    這篇文章主要介紹了SpringBoot響應(yīng)出現(xiàn)中文亂碼的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起來(lái)學(xué)習(xí)吧
    2024-02-02
  • idea 如何查找類中的某個(gè)方法

    idea 如何查找類中的某個(gè)方法

    這篇文章主要介紹了idea 如何查找類中的某個(gè)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02

最新評(píng)論

板桥市| 广宗县| 孟连| 通辽市| 泸水县| 随州市| 望奎县| 丰台区| 呼伦贝尔市| 盐源县| 台湾省| 天镇县| 鄂托克旗| 志丹县| 昌乐县| 万州区| 台湾省| 柯坪县| 丘北县| 洪雅县| 淮北市| 池州市| 嘉义县| 古蔺县| 辽阳县| 英超| 湘阴县| 阿鲁科尔沁旗| 绿春县| 临猗县| 项城市| 陕西省| 文水县| 桑植县| 吴堡县| 怀仁县| 安丘市| 合川市| 拜城县| 本溪市| 泰和县|