当前位置: 首页 > ai >正文

Caffeine 三种过期策略详解

🧑 博主简介:CSDN博客专家历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程高并发设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea

在这里插入图片描述


在这里插入图片描述

Caffeine 三种过期策略详解

Caffeine 中,cache.policy() 提供的三种过期策略接口(expireAfterWriteexpireAfterAccessexpireVariably)分别对应不同的缓存过期机制。以下是它们的核心区别和适用场景:


1. expireAfterWrite(固定写入过期)

Policy.FixedExpiration<String, String> policy = cache.policy().expireAfterWrite().orElse(null);

特点:

  • 基于写入时间:从条目创建或最后一次更新开始计时
  • 固定持续时间:所有条目使用相同的过期时间
  • 配置方式
    Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES)
    

适用场景:

  • 数据变更频率低
  • 需要保证数据新鲜度(如配置信息)
  • 简单易用的通用方案

示例:

// 设置所有条目写入后10分钟过期
policy.setExpiresAfter(10, TimeUnit.MINUTES);// 获取当前过期时间
long duration = policy.getExpiresAfter(TimeUnit.MINUTES); // 返回10

2. expireAfterAccess(固定访问过期)

Policy.FixedExpiration<String, String> policy = cache.policy().expireAfterAccess().orElse(null);

特点:

  • 基于访问时间:每次读取或写入都会重置计时器
  • 固定持续时间:所有条目使用相同的空闲时间
  • 配置方式
    Caffeine.newBuilder().expireAfterAccess(30, TimeUnit.MINUTES)
    

适用场景:

  • 频繁访问的热点数据
  • 读多写少的场景(如用户会话)
  • 需要保留活跃数据的缓存

示例:

// 设置所有条目30分钟未访问则过期
policy.setExpiresAfter(30, TimeUnit.MINUTES);// 获取当前过期时间
long duration = policy.getExpiresAfter(TimeUnit.MINUTES); // 返回30

3. expireVariably(可变过期)

Policy.VarExpiration<String, String> policy = cache.policy().expireVariably().orElse(null);

特点:

  • 完全动态:可为每个条目设置不同过期时间
  • 细粒度控制:支持运行时修改任意条目的过期时间
  • 配置方式
    Caffeine.newBuilder().expireAfter(new Expiry<String, String>() {// 自定义实现})
    

适用场景:

  • 不同条目需要不同过期时间
  • 动态调整过期策略(如促销商品短期缓存)
  • 高级缓存管理需求

示例:

// 设置testKey 5秒后过期
policy.put("testKey", "value", 5, TimeUnit.SECONDS);// 设置importantKey 24小时过期
policy.put("importantKey", "value", 24, TimeUnit.HOURS);// 修改testKey的过期时间
policy.setExpiresAfter("testKey", 10, TimeUnit.SECONDS);

核心区别对比表

特性expireAfterWriteexpireAfterAccessexpireVariably
时间基准写入时间访问时间任意时间
时间单位固定固定可变
重置机制仅写入重置读取/写入均重置手动控制
配置方式全局统一全局统一按条目设置
内存开销较高(+24字节/条目)
使用复杂度★☆☆☆☆★☆☆☆☆★★★★☆
适用场景数据变更敏感热点数据保留精细化控制

组合策略实现

虽然 Caffeine 本身不直接支持同时配置多种策略,但可通过 Expiry 接口模拟组合策略:

Caffeine.newBuilder().expireAfter(new Expiry<String, String>() {// 默认策略:写入后30分钟过期public long expireAfterCreate(String key, String value, long currentTime) {return TimeUnit.MINUTES.toNanos(30);}// 特殊key:访问后1小时过期public long expireAfterRead(String key, String value, long currentTime, long currentDuration) {if ("hotKey".equals(key)) {return TimeUnit.HOURS.toNanos(1);}return currentDuration;}// 更新时重置为写入过期public long expireAfterUpdate(String key, String value, long currentTime, long currentDuration) {return TimeUnit.MINUTES.toNanos(30);}})

生产环境建议

  1. 优先选择固定策略

    // 80%场景适用
    .expireAfterWrite(30, TimeUnit.MINUTES)
    
  2. 动态策略注意事项

    • 启用调度器:.scheduler(Scheduler.systemScheduler())
    • 监控内存:可变策略增加约24字节/条目开销
    • 避免频繁修改:批量操作更高效
  3. 过期策略选择指南

    场景推荐策略示例配置
    配置信息expireAfterWrite5-10分钟
    用户会话expireAfterAccess30分钟
    热点数据expireAfterAccess1小时
    短期活动expireVariably按需设置
    金融数据expireAfterWrite1分钟
  4. 监控与调优

    // 获取过期条目统计
    long expiredCount = cache.stats().evictionCount();// 检查策略是否生效
    if (cache.policy().expireAfterWrite().isPresent()) {// 固定写入策略已启用
    }
    

通过理解这三种策略的核心区别,我们可以根据业务场景选择最合适的缓存过期管理方案。

http://www.xdnf.cn/news/17186.html

相关文章:

  • java - 深拷贝 浅拷贝
  • 大模型2位量化原理解析
  • 【线性代数】5特征值和特征向量
  • “认知裂缝边缘”地带
  • 共识算法介绍
  • DrissionPage自动化:高效Web操作新选择
  • uniapp-vue2导航栏全局自动下拉变色
  • 360纳米AI、实在Agent、CrewAI与AutoGen……浅析多智能体协作系统
  • 下载 | Windows Server 2016最新原版ISO映像!(集成7月更新、标准版、数据中心版、14393.8246)
  • 智能制造的中枢神经工控机在自动化产线中的关键角色
  • 恒虚警检测(CFAR)仿真:杂波边缘与多目标场景分析
  • 代码随想录算法训练营 Day20
  • Oracle 19C In-Memory 列存储技术测试
  • Numpy科学计算与数据分析:Numpy数组创建与应用入门
  • TypeScript 中高频出现的类型结构与用法
  • C++模板知识点6『拆分模板参数』
  • 任务进度状态同步 万能版 参考 工厂+策略+观察者设计模式 +锁设计 springboot+redission
  • C++ 类和对象(2)
  • 顺序表——C语言
  • C++之队列浅析
  • SpringBoot学习日记 Day5:解锁企业级开发核心技能
  • 亚马逊采购风控突围:构建深度隐匿的环境安全体系
  • 剧本杀小程序系统开发:推动社交娱乐产业创新发展
  • TikTok Shop冷启动破局战:亚矩阵云手机打造爆款账号矩阵
  • 项目构想|文生图小程序
  • 人工智能2.0时代的人才培养和通识教育
  • 动手学深度学习(pytorch版):第一节——引言
  • Redis学习总结(持续更新)
  • 【45】C++函数重载是什么?函数重载需要注意什么?为什么C++支持函数重载,C语言不支持函数重载?C++和C语言代码之间如何相互调用?
  • 仓库管理系统-20-前端之记录管理的联表查询