Guava 与 Caffeine 本地缓存系统详解
☘️ Guava Cache(Google 出品)
一、简介
Guava 是 Google 开源的 Java 核心库,提供了大量工具类、集合类扩展、缓存框架等。其中 com.google.common.cache.Cache 是其缓存组件。
二、核心特性
| 特性 | 描述 | 
|---|
| 支持手动加载与自动加载 | 可以使用 Cache(手动)或LoadingCache(自动) | 
| 过期策略 | 基于时间(写入后 / 访问后) | 
| 最大容量控制 | 支持基于容量的逐出(eviction) | 
| 移除监听器 | 提供 RemovalListener | 
| 统计信息 | 缓存命中率、加载时间等统计 | 
| 并发性 | 线程安全,但并发性能一般 | 
三、典型用法示例
LoadingCache<String, String> cache = CacheBuilder.newBuilder().maximumSize(1000).expireAfterWrite(10, TimeUnit.MINUTES).removalListener(notification -> {System.out.println("移除原因:" + notification.getCause());}).build(new CacheLoader<String, String>() {@Overridepublic String load(String key) {return loadDataFromDB(key);}});
String value = cache.get("key1");
cache.put("key2", "value2");
⚡ Caffeine(Guava 的升级版)
一、简介
Caffeine 是 Guava Cache 的接班人,由 Ben Manes 编写,其目标是提供更高性能、更多特性、更现代化的缓存实现。
二、核心优势
| 特性 | Guava | Caffeine | 
|---|
| 性能 | 中等 | 极高(接近 ConcurrentHashMap) | 
| 驱逐算法 | LRU(近似) | Window TinyLFU(更智能) | 
| 支持异步 | ❌ | ✅( AsyncLoadingCache) | 
| 写入策略 | 写入后/访问后 | ✅ | 
| 缓存刷新 | 支持 refreshAfterWrite | ✅(异步刷新) | 
| 弱/软引用 | ✅ | ✅ | 
| 并发性能 | 中等 | 极好(基于分段机制) | 
三、核心用法示例
1. 同步加载缓存
LoadingCache<String, String> cache = Caffeine.newBuilder().maximumSize(1000).expireAfterWrite(10, TimeUnit.MINUTES).removalListener((String key, String value, RemovalCause cause) ->System.out.println("被移除 key=" + key + ", 原因=" + cause)).build(key -> loadDataFromDB(key));
2. 异步缓存(AsyncLoadingCache)
AsyncLoadingCache<String, String> asyncCache = Caffeine.newBuilder().maximumSize(1000).expireAfterWrite(10, TimeUnit.MINUTES).buildAsync(key -> CompletableFuture.supplyAsync(() -> loadDataFromDB(key)));
📊 Guava vs Caffeine 性能对比
- Caffeine 的 TinyLFU 驱逐算法可以在高并发和高命中率下表现极佳。
- 在 benchmark 中,Caffeine 的性能大约是 Guava 的 2~20 倍,特别是在多线程环境下优势更明显。
🧠 使用建议
| 使用场景 | 推荐缓存库 | 原因 | 
|---|
| 单线程、轻量级缓存 | Guava | 实现简单、依赖少 | 
| 高并发、性能敏感 | Caffeine | 极致性能、更强策略 | 
| 需要异步加载 | Caffeine | Guava 不支持异步加载 | 
| 简单本地缓存 | Guava | 快速上手,文档齐全 | 
| 大量数据缓存+智能淘汰 | Caffeine | 支持 TinyLFU,更智能 | 
🔧 典型配置参数对比
| 参数名 | Guava | Caffeine | 
|---|
| maximumSize | ✅ | ✅ | 
| expireAfterAccess | ✅ | ✅ | 
| expireAfterWrite | ✅ | ✅ | 
| refreshAfterWrite | ✅ | ✅ | 
| weakKeys/softValues | ✅ | ✅ | 
| removalListener | ✅ | ✅ | 
| recordStats() | ✅ | ✅ | 
| build()/buildAsync() | ✅(同步) | ✅(支持异步) | 
📝 结语
- Guava:适合一般场景,轻量级需求、快速接入。
- Caffeine:适合高并发、对性能有严格要求的项目,是目前 Java 生态最强大的本地缓存方案。