Caffeine介绍

Caffeine‌ 是一个高性能的 Java ‌本地缓存库‌,专为现代应用程序设计,由知名开发者 Ben Manes 开发。它是 Guava Cache 的进化版本,在性能和功能上都有显著提升,特别适合高并发场景。


核心作用:

  1. 内存缓存管理
    将频繁访问的数据存储在内存中,避免重复计算或频繁访问外部资源(如数据库、API)

  2. 加速数据访问
    相比磁盘/网络 I/O,内存访问速度提升 100-100,000 倍

  3. 降低系统负载
    减少对后端资源(数据库、服务)的访问压力


关键特性:

特性说明性能影响
Window TinyLFU 算法智能淘汰策略(比LRU更高效)命中率提升 40%+
无锁并发设计基于 ConcurrentHashMap 优化读写性能提升 8 倍 vs Guava
异步刷新机制后台自动更新过期数据避免访问延迟
权重控制按对象大小而非数量限制缓存内存利用率优化
统计监控实时命中率/加载时间统计便于调优

典型使用场景:


javaCopy Code

// 1. 基础缓存示例 Cache<String, User> cache = Caffeine.newBuilder() .maximumSize(10_000) // 最大条目数 .expireAfterWrite(5, TimeUnit.MINUTES) // 写入5分钟后过期 .build(); // 使用缓存 User user = cache.get(userId, id -> userDao.getUser(id)); // 2. 自动刷新(防止缓存击穿) LoadingCache<String, Data> loadingCache = Caffeine.newBuilder() .refreshAfterWrite(1, TimeUnit.MINUTES) // 1分钟后异步刷新 .build(key -> fetchFromDatabase(key));


高性能原理:

  1. 并发优化

    
    

    plaintextCopy Code

    读操作:完全无锁 (基于 ConcurrentHashMap) 写操作:最小化锁竞争 (分段锁技术)

  2. 内存效率

    
    

    plaintextCopy Code

    对象存储优化 - 比 Guava 减少 30% 内存占用 避免 GC 压力 - 使用软/弱引用策略可控

  3. 智能淘汰

    
    

    plaintextCopy Code

    TinyLFU 算法流程图: 新访问数据 → 进入 Admission Window → 频率统计 → ├─ 高频数据 → 保留 └─ 低频数据 → 对比历史频率 → 淘汰最低频


与同类对比:

特性CaffeineGuava CacheEhcache
并发吞吐量⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
内存效率⭐⭐⭐⭐⭐⭐⭐⭐⭐
命中率⭐⭐⭐⭐⭐⭐⭐⭐⭐
集群支持
监控功能⚠️ 有限

SpringBoot 集成:


yamlCopy Code

# application.yml spring: cache: type: caffeine caffeine: spec: maximumSize=50000,expireAfterWrite=300s


javaCopy Code

@Configuration public class CacheConfig { @Bean public CacheManager cacheManager() { CaffeineCacheManager manager = new CaffeineCacheManager(); manager.setCaffeine(Caffeine.newBuilder() .initialCapacity(1000) .maximumSize(50_000) .expireAfterAccess(10, TimeUnit.MINUTES) .recordStats()); // 开启统计 return manager; } } // 使用缓存 @Service public class UserService { @Cacheable(value = "users", key = "#id") public User getUser(String id) { // DB查询操作 } }


百万 QPS 场景最佳实践:

  1. 多级缓存架构
    Caffeine(本地) → Redis(分布式) → DB(持久层)

  2. 缓存预热策略

    
    

    javaCopy Code

    // 启动时加载热点数据 @PostConstruct public void preloadCache() { hotKeys.parallelStream().forEach(key -> cache.get(key, this::loadFromDB) ); }

  3. 防穿透方案

    
    

    javaCopy Code

    .build(key -> { Data data = dbLoader.load(key); return data != null ? data : new EmptyObject(); // 空值缓存 });

  4. 监控统计

    
    

    javaCopy Code

    CacheStats stats = cache.stats(); log.info("命中率: {}%", stats.hitRate() * 100); log.info("平均加载时间: {}ms", stats.averageLoadPenalty() / 1_000_000);


性能数据参考:

QPS服务器配置平均响应GC 影响
50万4核8G< 2msYoung GC < 5ms/分钟
100万8核16G< 5msFull GC ≈ 0
500万16核32G集群< 10ms可控 STW

实测数据:单机 Caffeine 可支撑 200万+ OPS(8核 CPU)

Caffeine 是现代 Java 高并发系统的首选本地缓存解决方案,尤其适合作为缓存体系的「第一道防线」,配合分布式缓存实现百万级 QPS 场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值