Caffine的一些学习过程
Caffeine的简介
Caffeine 是一个基于 Java 8+ 的高性能本地缓存库,由 Ben Manes 开发,是 Google Guava Cache 的优化加强版。自 Spring 5 开始,Caffeine 已成为 Spring Boot 默认的缓存实现方案
核心定位
Caffeine 本质上是一个带有自动清理策略的并发 Map。与 ConcurrentHashMap 的主要区别在于:
- ConcurrentMap:存储所有数据,直到显式移除
- Caffeine:通过配置策略自动移除”不常用”数据,保持内存合理占用
主要特点
1. 极致性能
- 吞吐量可达 1,000,000+ ops/s
- 读写操作时间复杂度为 O(1),接近 HashMap 性能
- 采用优化的并发数据结构和异步并行策略
2. 智能淘汰算法
- 使用 W-TinyLFU (Window Tiny Least Frequently Used) 算法,平衡访问频率与时效性,命中率接近最优
- 相比传统 LRU 算法,能更好地保护热点数据
3. 灵活的过期策略
支持多种驱逐配置:
- 基于大小:
maximumSize(1000) - 基于时间:
expireAfterWrite()(写入后过期)、expireAfterAccess()(访问后过期) - 基于引用:利用 Java 弱引用/软引用
- 自定义:通过
Expiry接口实现动态过期逻辑
4. 异步支持
- 提供
AsyncLoadingCache接口,支持非阻塞加载和自动刷新 - 返回
CompletableFuture,避免主线程阻塞
5. 丰富的监控统计
- 内置命中率、加载次数、驱逐次数等统计功能
- 可通过
.recordStats()启用,便于调优和监控
6. 生态集成
- API 设计兼容 Guava Cache,迁移成本低
- 与 Spring Cache、Spring Boot Actuator、Prometheus 等无缝集成
适用场景
单机缓存:Caffeine 是本地内存缓存,数据不跨 JVM 共享,适用于:
- 缓存热点数据,减少数据库压力
- 频繁读取但更新较少的配置数据
- 需要微秒级延迟响应的场景
注意:分布式场景需配合 Redis、Hazelcast 等远程缓存使用
。
典型用法示例
java
Copy
1 | // 创建缓存 |
与其他方案对比
| 特性 | Caffeine | Guava Cache | Ehcache | Redis |
|---|---|---|---|---|
| 吞吐量 | 1,000,000+ ops/s | 300,000-500,000 ops/s | 500,000-800,000 ops/s | 100,000-500,000 ops/s |
| 维护状态 | 活跃维护 | 已停止更新 | 活跃维护 | 活跃维护 |
| 异步支持 | 原生支持 | 不支持 | 有限支持 | 外部支持 |
| 适用场景 | 本地缓存 | 本地缓存 | 本地缓存 | 分布式缓存 |
核心优势总结:相比 Guava Cache 性能更高、内存效率更好;相比 Redis 在单机场景下延迟更低(无网络开销)。
下面讲一下Caffeine的底层实现。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 无知的小狼!
评论
