1. Caffeine 缓存基础解析
1.1 核心设计原理与特性
Caffeine 是一个高性能的 Java 本地缓存库,其核心设计基于现代硬件特性做了深度优化。与传统的缓存实现不同,Caffeine 采用了 Window-TinyLFU 淘汰算法,这是其高性能的关键所在。具体实现上,它维护了两个队列:
- 一个较小的窗口队列(通常占1%容量)用于存放最新访问的条目
- 主队列则采用 TinyLFU 策略管理
这种混合策略既能够捕捉突发性的热点访问(通过窗口队列),又能通过 TinyLFU 识别长期热点数据。实测表明,这种设计相比纯 LRU 算法可以提高至少20%的命中率。
实际项目中,我建议将窗口大小设置为总容量的1%-2%,这个比例在大多数场景下都能取得较好的平衡。
Caffeine 的内存管理采用权重系统,允许为不同条目设置不同的权重值。例如,我们可以这样配置:
java复制Caffeine.newBuilder()
.maximumWeight(10_000)
.weigher((String key, String value) -> value.length())
.build();
这个特性特别适合存储大小差异较大的对象,避免因个别大对象占用过多空间。
1.2 典型使用场景与数据存储
在实际项目中,Caffeine 最适合缓存以下几种类型的数据:
- 频繁访问的配置信息(如系统参数、业务规则)
- 计算成本高的中间结果(如报表预聚合数据)
- 需要快速响应的热点数据(如商品详情页的库存信息)
数据添加方式主要有三种模式:
- 手动加载:直接调用
cache.put(key, value) - 自动加载:通过
LoadingCache自动加载未命中数据 - 异步加载:使用
AsyncLoadingCache实现非阻塞加载
这里特别推荐自动加载模式,它能显著简化代码:
java复制LoadingCache<Key, Graph> cache = Caffeine.newBuilder()
.maximumSize(10_000)
.build(key -> createExpensiveGraph(key));
