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


相关推荐
optimistic_chen2 小时前
【Redis 系列】常用数据结构---String类型
数据结构·数据库·redis·缓存·string
大猫子的技术日记2 小时前
Redis 快速上手实战教程:从零搭建高性能缓存系统
数据库·redis·缓存
修炼室2 小时前
Freebase + Virtuoso 大规模导入实战:切片 Chunk、调大缓存、脚本化监控进度(可复现)
缓存
风筝在晴天搁浅3 小时前
hot100 146.LRU缓存
java·缓存
予枫的编程笔记15 小时前
Redis 核心数据结构深度解密:从基础命令到源码架构
java·数据结构·数据库·redis·缓存·架构
周胡杰16 小时前
鸿蒙preferences单多例使用,本地存储类
缓存·华为·harmonyos·preferences·鸿蒙本地存储
爱丽_16 小时前
MyBatis事务管理与缓存机制详解
数据库·缓存·mybatis
一条大祥脚18 小时前
25.12.30
数据库·redis·缓存
攻心的子乐1 天前
redis 使用Pipelined 管道命令批量操作 减少网络操作次数
数据库·redis·缓存