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);
相关推荐
阳光是sunny5 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
灯澜忆梦6 小时前
GO_并发编程---定时器
开发语言·后端·golang
阳光是sunny6 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
鱟鲥鳚6 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
皮皮林5516 小时前
开源实力派,给本地 AI 装上深度调研能力,一张 3090 跑到 95.7 分!
后端
努力的小雨7 小时前
把 Windows 桌面图标做成一个会自己运转的小世界
后端
武子康7 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
腾渊信息科技公司8 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
IT_陈寒9 小时前
Vue这个特性差点让我加班到凌晨,谁懂啊
前端·人工智能·后端
段一凡-华北理工大学9 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化