文章目录
- [一、Caffeine 是什么?先立个世界观](#一、Caffeine 是什么?先立个世界观)
- [二、Caffeine vs Redis(面试必问)](#二、Caffeine vs Redis(面试必问))
- [三、引入依赖(Spring Boot)](#三、引入依赖(Spring Boot))
- [四、最基础用法(纯 Java)](#四、最基础用法(纯 Java))
- 五、进阶:自动加载缓存(强烈推荐)
-
-
- [1️⃣ LoadingCache(同步)](#1️⃣ LoadingCache(同步))
- [2️⃣ AsyncLoadingCache(异步)](#2️⃣ AsyncLoadingCache(异步))
-
一、Caffeine 是什么?先立个世界观
一句话定位:
Caffeine = 高性能 JVM 本地缓存库 ,主打极快 、线程安全 、自动淘汰。
它的灵感来自 Google Guava Cache,但性能和算法全面升级。
它解决什么问题?
-
频繁查数据库 / RPC,响应慢
-
Redis 太远,本地就能解决的还要走网络
-
一些热点数据(配置、字典、权限、用户信息)
不适合它的场景
-
分布式共享数据
-
需要持久化
-
多节点强一致缓存
口诀 :
👉 "单机、热点、读多写少" = Caffeine 的主战场
二、Caffeine vs Redis(面试必问)
| 对比项 | Caffeine | Redis |
|---|---|---|
| 存储位置 | JVM 内存 | 独立服务 |
| 访问速度 | 纳秒级 | 毫秒级 |
| 分布式 | ❌ | ✅ |
| 重启丢失 | ✅ | ❌ |
| 适合场景 | 本地热点 | 全局共享 |
👉 最佳实践:
Caffeine + Redis 二级缓存(后面我会给你完整代码)
三、引入依赖(Spring Boot)
xml
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
四、最基础用法(纯 Java)
java
Cache<String, String> cache = Caffeine.newBuilder()
.maximumSize(10_000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
// 写
cache.put("user:1", "张三");
// 读
String value = cache.getIfPresent("user:1");
核心参数解释
-
maximumSize:最大缓存条数(不是内存大小) -
expireAfterWrite:写入后多久过期 -
expireAfterAccess:多久没访问就过期
五、进阶:自动加载缓存(强烈推荐)
1️⃣ LoadingCache(同步)
java
LoadingCache<Long, User> userCache =
Caffeine.newBuilder()
.maximumSize(5000)
.expireAfterWrite(30, TimeUnit.MINUTES)
.build(userId -> {
// 缓存不存在时自动执行
return userService.getById(userId);
});
// 自动加载
User user = userCache.get(1L);
✔ 好处
防止缓存穿透
代码更干净
2️⃣ AsyncLoadingCache(异步)
java
AsyncLoadingCache<Long, User> cache =
Caffeine.newBuilder()
.maximumSize(5000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.buildAsync(id -> userService.getById(id));
// 返回 CompletableFuture
User user = cache.get(1L).get();
✔ 高并发 + IO 场景非常香