Caffeine介绍
Caffeine 是一个高性能的 Java 本地缓存库,专为现代应用程序设计,由知名开发者 Ben Manes 开发。它是 Guava Cache 的进化版本,在性能和功能上都有显著提升,特别适合高并发场景。
核心作用:
内存缓存管理
将频繁访问的数据存储在内存中,避免重复计算或频繁访问外部资源(如数据库、API)加速数据访问
相比磁盘/网络 I/O,内存访问速度提升 100-100,000 倍降低系统负载
减少对后端资源(数据库、服务)的访问压力
关键特性:
特性 | 说明 | 性能影响 |
---|---|---|
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));
高性能原理:
并发优化
plaintextCopy Code
读操作:完全无锁 (基于 ConcurrentHashMap) 写操作:最小化锁竞争 (分段锁技术)
内存效率
plaintextCopy Code
对象存储优化 - 比 Guava 减少 30% 内存占用 避免 GC 压力 - 使用软/弱引用策略可控
智能淘汰
plaintextCopy Code
TinyLFU 算法流程图: 新访问数据 → 进入 Admission Window → 频率统计 → ├─ 高频数据 → 保留 └─ 低频数据 → 对比历史频率 → 淘汰最低频
与同类对比:
特性 | Caffeine | Guava Cache | Ehcache |
---|---|---|---|
并发吞吐量 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
内存效率 | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
命中率 | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ |
集群支持 | ❌ | ❌ | ✅ |
监控功能 | ✅ | ⚠️ 有限 | ✅ |
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 场景最佳实践:
多级缓存架构
Caffeine(本地) → Redis(分布式) → DB(持久层)
缓存预热策略
javaCopy Code
// 启动时加载热点数据 @PostConstruct public void preloadCache() { hotKeys.parallelStream().forEach(key -> cache.get(key, this::loadFromDB) ); }
防穿透方案
javaCopy Code
.build(key -> { Data data = dbLoader.load(key); return data != null ? data : new EmptyObject(); // 空值缓存 });
监控统计
javaCopy Code
CacheStats stats = cache.stats(); log.info("命中率: {}%", stats.hitRate() * 100); log.info("平均加载时间: {}ms", stats.averageLoadPenalty() / 1_000_000);
性能数据参考:
QPS | 服务器配置 | 平均响应 | GC 影响 |
---|---|---|---|
50万 | 4核8G | < 2ms | Young GC < 5ms/分钟 |
100万 | 8核16G | < 5ms | Full GC ≈ 0 |
500万 | 16核32G集群 | < 10ms | 可控 STW |
实测数据:单机 Caffeine 可支撑 200万+ OPS(8核 CPU)
Caffeine 是现代 Java 高并发系统的首选本地缓存解决方案,尤其适合作为缓存体系的「第一道防线」,配合分布式缓存实现百万级 QPS 场景。