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);
相关推荐
万少37 分钟前
AtomCode开发微信小程序《谁去呀》 全流程
前端·javascript·后端
GetcharZp38 分钟前
Epic、暴雪都在用的 C++ 界面利器:Dear ImGui 零基础全景指南
后端
pixcarp2 小时前
知识库系统的内容资产闭环怎么设计
服务器·数据库·后端·golang
红尘散仙2 小时前
别再手动录屏了:用 VHS 给终端应用生成会动的文档素材
后端·rust
张忠琳5 小时前
【Go 1.26.4】Golang Select 深度解析
开发语言·后端·golang
IT策士5 小时前
Redis 从入门到精通:性能调优与多语言客户端对比
数据库·redis·缓存
IT_陈寒5 小时前
React中useEffect依赖项这个坑我居然踩了三天
前端·人工智能·后端
提笔了无痕6 小时前
如何用Go实现整套RAG流程
开发语言·后端·golang
成都第一深情IZZO6 小时前
事务未提交就发送 MQ,导致消费者读不到订单数据的问题
后端
大橙子打游戏7 小时前
Fable5不能用了,但是依然能让 AI 纯靠截图玩通宝可梦
后端