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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 创建缓存
Cache<String, User> cache = Caffeine.newBuilder()
.maximumSize(100) // 最多存储100个
.expireAfterWrite(10, TimeUnit.MINUTES) // 10分钟未写则过期
.recordStats() // 启用统计
.build();

// 存数据
cache.put("user101", new User("张三"));

// 取数据
User user = cache.getIfPresent("user101");

// 取不到时自动加载
User user = cache.get("user101", key -> userDao.getUser(key));

与其他方案对比

特性 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的底层实现。