1. Caffeine缓存库深度解析
作为Java生态中最强大的本地缓存解决方案,Caffeine在性能指标上全面超越了传统的Guava Cache和Ehcache。其核心在于采用了创新的Window TinyLFU淘汰算法,相比传统的LRU(最近最少使用)算法,内存命中率提升了30%-50%。这主要得益于其对访问频率和最近访问时间的双重考量。
提示:Window TinyLFU算法通过频率素描(Count-Min Sketch)数据结构高效统计元素访问频率,同时使用滑动窗口机制捕捉最新的访问热点。
在实际压力测试中,Caffeine的吞吐量可达Guava Cache的2-3倍。这源于其精妙的设计:
- 使用并发优化的哈希表存储条目
- 写操作通过环形缓冲区批处理
- 读操作采用无锁设计
- 异步维护策略数据结构
1.1 核心特性对比
| 特性 | Caffeine | Guava Cache | Ehcache |
|---|---|---|---|
| 淘汰算法 | TinyLFU | LRU | LRU |
| 最大吞吐量(ops/s) | 1,200万 | 400万 | 300万 |
| 内存占用 | 低 | 中等 | 高 |
| 持久化支持 | ❌ | ❌ | ✔️ |
| 集群支持 | ❌ | ❌ | ✔️ |
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 三种缓存构建模式详解
2.1 手动缓存(Manual Cache)
这是最基础的缓存模式,适合需要精细控制缓存行为的场景。构建示例如下:
java复制Cache<String, Product> cache = Caffeine.newBuilder()
.initialCapacity(100) // 初始哈希表大小
.maximumSize(10_000) // 基于条目数限制
// 或使用权重限制
// .maximumWeight(50_000)
// .weigher((String key, Product prod) -> prod.getSizeInKB())
.expireAfterWrite(30, TimeUnit.MINUTES) // 写入后过期
.expireAfterAccess(15, TimeUnit.MINUTES) // 访问后过期
.removalListener((String key, Product prod, RemovalCause cause) ->
log.info("产品 {} 被移除,原因:{}", key, cause))
.recordStats() // 开启命中统计
.build();
关键参数说明
