目录
一、前言简介
Java Caffeine 是一个基于 Java 8 的高性能本地缓存库,由 Google Guava Cache 改进而来,被 Spring 5(及 Spring Boot 2.x)选为默认缓存组件,替代了 Guava Cache。它通过先进的算法和灵活的配置,显著提升缓存命中率,适用于高并发场景。
二、核心特性
1. 高性能算法
-
采用Window TinyLFU 算法(结合 LRU 和 LFU 的优势),在读写密集场景下命中率接近最优,性能远超 Guava Cache 和 Ehcache。
-
无锁并发设计(如 `StampedLock`),支持高并发访问。
2. 灵活的驱逐策略
-
基于容量:通过 `maximumSize` 限制条目数量,超出时自动淘汰低频数据。
-
基于时间:支持 `expireAfterWrite`(写入后过期)和 `expireAfterAccess`(访问后过期)。
-
基于引用:可用 `weakKeys`/`weakValues`(弱引用)或 `softValues`(软引用)依赖 GC 回收内存。
3. 异步加载与刷新
-
支持同步/异步加载数据(如 `CacheLoader`),避免缓存穿透。
-
通过 `refreshAfterWrite` 后台刷新旧数据,访问时返回旧值并触发异步更新。
4. 事件监听与统计
-
提供 `removalListener` 监听条目移除事件(如过期、手动删除)。
-
启用 `recordStats()` 可统计命中率、加载次数等指标。
三、使用方式
加载方式 | 特点 | 示例代码 |
---|---|---|
手动加载 | 显式调用 put() 和 getIfPresent() | Cache<String, String> cache = Caffeine.newBuilder().build(); cache.put("k1", "v1"); |
自动加载 | 通过 CacheLoader 自动加载缺失数据 | LoadingCache<String, String> cache = Caffeine.newBuilder() .build(key -> loadFromDB(key)); |
异步手动加载 | 返回 CompletableFuture ,非阻塞获取结果 | AsyncCache<String, String> asyncCache = Caffeine.newBuilder().buildAsync(); asyncCache.get(key, k -> loadAsync(k)); |
异步自动加载 | 结合异步加载与自动刷新,适合高延迟数据源 | AsyncLoadingCache<String, String> cache = Caffeine.newBuilder() .buildAsync(key -> loadAsync(key)); |
四、缓存驱逐策略
-
容量驱逐:`maximumSize` 限制条目数(默认使用 W-TinyLFU 淘汰低频数据)。
-
时间驱逐:
.expireAfterWrite(10, TimeUnit.MINUTES) // 写入后10分钟过期 .expireAfterAccess(5, TimeUnit.MINUTES) // 访问后5分钟过期
-
引用驱逐:通过 `weakKeys().softValues()` 结合 GC 回收(性能较差,慎用)。
五、与Guava Cache对比
特性 | Caffeine | Guava Cache |
---|---|---|
算法 | Window TinyLFU(高命中率) | LRU(易受突发流量影响) |
立即失效处理 | 正确识别 expireAfterAccess(0) | 转换为 maximumSize=0 |
异步支持 | 内置异步刷新和加载 | 无原生异步刷新 |
性能 | 读写吞吐量提升 30% 以上 | 较低 |
六、典型应用场景
-
Web 应用:缓存用户会话、频繁查询的数据库结果(如用户信息)。
-
微服务架构:作为本地缓存与 Redis 等分布式缓存组成多级缓存,减轻网络压力。
-
高并发系统:减少重复计算,例如缓存中间结果或热点数据。
七、依赖添加——基于Maven
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>3.1.8</version> <!-- 2025年最新版 -->
</dependency>
八、总结归纳
Caffeine 凭借其高性能、灵活的配置和接近最优的命中率,成为 Java 本地缓存的首选方案。尤其适合需要低延迟、高并发的场景,如电商秒杀、实时数据分析等,其设计平衡了内存占用与访问效率,是优化系统性能的利器。