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>() {
@Override
public 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 生态最强大的本地缓存方案。