Caffeine 本地缓存

文章目录

  • [一、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 场景非常香


相关推荐
野生技术架构师2 小时前
Redis 和 MySQL 如何保证数据一致性?先更新数据库还是先删缓存,延迟双删、MQ、Canal 一次讲透
数据库·redis·缓存
Patrick在香港3 小时前
Claude API 成本直降90%:Prompt Caching 提示词缓存 Python 实战
python·缓存·prompt
NeilYuen1 天前
【vemory】高性能KV存储AOF方案设计
linux·c++·redis·缓存
LuminousCPP1 天前
数据结构基础篇(二):顺序表与链表全方位对比|从内存布局到 CPU 缓存理解底层差异
c语言·数据结构·经验分享·链表·缓存
spter。1 天前
Redis 与 Single-flight 的分工与协作
数据库·redis·缓存
清水白石0081 天前
Python 如何设计一个线程安全的缓存?从锁策略、LRU 到工程化实战
python·安全·缓存
小宋10212 天前
大模型应用如何控制成本与延迟:Token、缓存、流式和降级实战
人工智能·缓存
番茄炒鸡蛋加糖2 天前
项目技术点总结--四大核心技术+缓存
缓存
大飞记Python2 天前
AI大模型Token计费全解析:输入/输出、缓存命中、阶梯计价一文看懂
人工智能·缓存
Rain的Java大神之路2 天前
线上接口负载满了如何解决
java·数据库·redis·后端·缓存·面试·架构