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 场景非常香


相关推荐
AOwhisky3 小时前
Redis 学习笔记(第四期):高可用与集群(哨兵 + Cluster + 容器化)
linux·运维·数据库·redis·笔记·学习·缓存
MXsoft6185 小时前
**断网续传与本地缓存:弱网环境下的监控数据保障方案**
运维·缓存·自动化
xingyuzhisuan5 小时前
缓存命中率提升方案:从 30% 优化至 82% 全流程优化记录
java·开发语言·缓存·ai
Konwledging6 小时前
Cache Incoherent(缓存不一致)
缓存
慕木沐7 小时前
【Spring AI + Google ADK 】流式输出时 outputKey 状态缓存失败的问题
人工智能·spring·缓存
swordbob7 小时前
缓存延迟双删的两种策略
java·缓存
odoo中国10 小时前
Odoo19 内置缓存原理、用法与避坑指南
缓存·odoo19·实际案例·缓存原理·内置缓存用法
胡小禾10 小时前
Redis哨兵模式下主从同步的偏差
数据库·redis·缓存
zzqssliu11 小时前
Taocarts接口限流实操:基于Redis实现API防刷与流量管控
数据库·redis·缓存
大囚长11 小时前
大模型服务端如何命中缓存
java·人工智能·缓存·dubbo