Caffeine
This content is not available in your language yet.
Caffeine 是 Java 进程内缓存库。它把 W-TinyLFU 驱逐策略、并发读路径与异步写后维护组合起来,提供有界缓存、过期、刷新、统计和加载能力。
本册问题地图
Section titled “本册问题地图”Caffeine 要沿着“读路径快、写路径可维护、容量有边界”来理解:
- 为什么命中读取不直接维护全部策略? 读路径若同步更新频率、队列和时间信息,会把每次访问都变成共享写;Caffeine 把部分维护延后到写后缓冲和维护任务。
- W-TinyLFU 解决什么矛盾? 只按最近访问容易让一次性大流量污染缓存,只按频率又会淘汰掉刚刚变热的键;它用窗口、准入比较和频率估计平衡两者。
- 过期与容量驱逐谁先发生? 过期是时间条件,容量驱逐是空间条件;一次读取或维护可能同时发现两者,不能把“没读到”简单归因于缓存未命中。
- 异步加载如何避免重复建值? 同一个 key 的加载应共享进行中的 Future,失败后还要决定是否移除失败结果,否则下一次请求会复用错误状态。
- 缓存为什么一定要有边界? 本地缓存用内存换延迟,容量、权重、过期和加载并发共同决定它是否会反过来拖垮应用。
| 项 | 值 |
|---|---|
| 仓库 | ben-manes/caffeine |
| 本地路径 | E:\source\java\base\caffeine |
| 分支 | master |
| Commit | 9da6581e(2026-08-10) |
| 最近 tag | v3.2.4 |
本册源码坐标均基于上述 commit。
Caffeine#build—Caffeine.java:1102:配置选择实现。BoundedLocalCache#getIfPresent—BoundedLocalCache.java:2257:命中读路径。drainReadBuffer/drainWriteBuffer—BoundedLocalCache.java:1829、1903:写后维护。FrequencySketch、admit:W-TinyLFU 准入。TimerWheel:动态过期。LocalAsyncLoadingCache#get—LocalAsyncLoadingCache.java:113:异步加载。