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的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存
杰克尼3 小时前
redis(day03-商户查询缓存)
数据库·redis·缓存
刘~浪地球4 小时前
Redis 从入门到精通(十三):哨兵与集群
数据库·redis·缓存
一个有温度的技术博主5 小时前
Lua语法详解:从变量声明到循环遍历的避坑指南
redis·缓存·lua
一个有温度的技术博主7 小时前
深入多级缓存:JVM进程缓存实战与数据库表拆分策略
jvm·数据库·缓存
一个有温度的技术博主7 小时前
Lua语法进阶:函数封装与条件控制的艺术
redis·分布式·缓存·lua
一个有温度的技术博主7 小时前
突破性能极限:深入解析多级缓存架构设计与实践
redis·缓存
手握风云-7 小时前
Redis:不只是缓存那么简单(三)
缓存
白露与泡影7 小时前
Spring Boot 缓存架构:一行配置切换 Caffeine 与 Redis,透明支持多租户隔离
spring boot·缓存·架构
roman_日积跬步-终至千里7 小时前
【系统架构师-案例题-分布式数据缓存架构】22年下(3)分布式仓储货物管理系统
分布式·缓存·系统架构