Caffeine缓存的使用

1.springboot集成Caffeine

java 复制代码
    <!-- caffeine缓存依赖包-->
        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
            <version>2.9.3</version>
        </dependency>

2.Cache 模式

1)普通使用

java 复制代码
  // 普通缓存
        cache = Caffeine.newBuilder()
                .expireAfterWrite(10, TimeUnit.MINUTES)
                .maximumSize(1000)  // 设置缓存的最大容量
                .build();
// 查找一个缓存元素, 没有查找到的时候返回null
MyObject graph = cache.getIfPresent(key);
// 查找缓存,如果缓存不存在则生成缓存元素,  如果无法生成则返回null
graph = cache.get(key, k -> userService.getUserCache((Integer) key));
// 添加或者更新一个缓存元素
cache.put(key, graph);
// 移除一个缓存元素
cache.invalidate(key);

2)同步缓存

java 复制代码
  // 同步自动加载缓存
        autoCache = Caffeine.newBuilder()
                .expireAfterWrite(10, TimeUnit.MINUTES)  // 设置写入后的过期时间
                .maximumSize(1000)  // 设置缓存的最大容量
                .build(key -> userService.getUserCache((Integer) key));
            //缓存未命中会自动调用当前方法,将数据库获取到的数据缓存到Caffeine

graph = cache.get(key);
// 添加或者更新一个缓存元素
cache.put(key, graph);
// 移除一个缓存元素
cache.invalidate(key);

3)异步缓存

java 复制代码
// 异步加载缓存
        asyncCache = Caffeine.newBuilder()
                .expireAfterWrite(10, TimeUnit.MINUTES)  // 设置写入后的过期时间
                .maximumSize(1000)  // 设置缓存的最大容量
                .buildAsync().synchronous();

// 查找缓存,如果缓存不存在则生成缓存元素,  如果无法生成则返回null
graph = cache.get(key, k -> userService.getUserCache((Integer) key));
// 添加或者更新一个缓存元素
cache.put(key, graph);
// 移除一个缓存元素
cache.invalidate(key);

4.异步自动缓存

java 复制代码
    // 异步自动加载缓存
        autoAsyncCache = Caffeine.newBuilder()
                .expireAfterWrite(10, TimeUnit.MINUTES)  // 设置写入后的过期时间
                .maximumSize(1000)  // 设置缓存的最大容量
                .buildAsync(key ->
                    // 异步加载缓存逻辑
                    userService.getUserCache((Integer)key)
                );
graph = cache.get(key);
// 添加或者更新一个缓存元素
cache.put(key, graph);
// 移除一个缓存元素
cache.invalidate(key);

5.自定义每个缓存过期时间

java 复制代码
  //首先自定义过期时间
        expireAfterCache = Caffeine.newBuilder().expireAfter(new Expiry<Object, Object>() {
            @Override
            public long expireAfterCreate(@NonNull Object key, @NonNull Object value, long currentTime) {
                return currentTime;
            }

            @Override
            public long expireAfterUpdate(@NonNull Object key, @NonNull Object value, long currentTime, @NonNegative long currentDuration) {
                return currentDuration;
            }

            @Override
            public long expireAfterRead(@NonNull Object key, @NonNull Object value, long currentTime, @NonNegative long currentDuration) {
                return currentDuration;
            }
        }).maximumSize(1000).build();

// 添加或者更新一个缓存元素
 expireAfterCache.policy().expireVariably().ifPresent(p->{
//为每个key设置不同的过期时间,可自行封装下
            p.put("cs","123",5,TimeUnit.SECONDS);
        });

// 查找一个缓存元素, 没有查找到的时候返回null
MyObject graph = expireAfterCache.getIfPresent(key);

// 移除一个缓存元素
expireAfterCache.invalidate(key);
相关推荐
s1mple“”18 分钟前
大厂Java面试实录:从Spring Boot到AI技术的电商场景深度解析
spring boot·redis·微服务·kafka·向量数据库·java面试·ai技术
会飞的大可1 小时前
Redis 竞品与替代方案选型可行性分析报告
数据库·redis·缓存
yhole2 小时前
springboot三层架构详细讲解
spring boot·后端·架构
香香甜甜的辣椒炒肉2 小时前
Spring(1)基本概念+开发的基本步骤
java·后端·spring
白毛大侠3 小时前
Go Goroutine 与用户态是进程级
开发语言·后端·golang
golang学习记3 小时前
IDEA 2026.1全新调试新特性:Spring Boot调试不再靠猜!
java·spring boot·intellij-idea
ForteScarlet3 小时前
从 Kotlin 编译器 API 的变化开始: 2.3.20
android·开发语言·后端·ios·开源·kotlin
橘子编程3 小时前
OpenClaw(小龙虾)完整知识汇总
java·前端·spring boot·spring·spring cloud·html5
大阿明3 小时前
SpringBoot - Cookie & Session 用户登录及登录状态保持功能实现
java·spring boot·后端
Binary-Jeff3 小时前
Spring 创建 Bean 的关键流程
java·开发语言·前端·spring boot·后端·spring·学习方法