尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Hutool 的 `TimedCache` 到期会自动清理吗? ——————hutool cache的“惰性清理“和“定期清理“

Hutool 的 `TimedCache` 到期会自动清理吗? ——————hutool cache的“惰性清理“和“定期清理“
📅 发布时间:2026/6/30 1:54:05

核心清理机制

1.惰性清理(Lazy Eviction)

TimedCache<String, Object> cache = new TimedCache<>(1000); // 默认过期时间1秒 cache.put("key1", "value1"); // 在get时检查是否过期 Object value = cache.get("key1"); // 如果已过期,返回null并从map中移除

每次调用get()或containsKey()时,会检查该键是否过期,如果过期则移除。

2.定期清理(Schedule Prune)

TimedCache<String, Object> cache = new TimedCache<>(1000); cache.schedulePrune(1000); // 启动定时清理,每1000ms执行一次

通过调用schedulePrune()方法启动定时清理任务,定期扫描并移除过期项。

回到顶部

🔧 使用示例

示例1:基本使用(不自动清理)

import cn.hutool.cache.impl.TimedCache; public class TimedCacheExample1 { public static void main(String[] args) throws InterruptedException { // 创建缓存,默认过期时间1000ms TimedCache<String, String> cache = new TimedCache<>(1000); // 放入数据 cache.put("key1", "value1"); // 立即获取 System.out.println("立即获取:" + cache.get("key1")); // 输出: value1 // 等待1.1秒 Thread.sleep(1100); // 过期后获取 System.out.println("1.1秒后获取:" + cache.get("key1")); // 输出: null // 注意:此时key1会从map中移除 // 检查大小 System.out.println("缓存大小:" + cache.size()); // 输出: 0 } }

示例2:启动定时清理

import cn.hutool.cache.impl.TimedCache; public class TimedCacheExample2 { public static void main(String[] args) throws InterruptedException { // 创建缓存,默认过期时间1000ms TimedCache<String, String> cache = new TimedCache<>(1000); // 启动定时清理,每500ms执行一次 cache.schedulePrune(500); cache.put("key1", "value1"); cache.put("key2", "value2", 2000); // 单独设置过期时间2000ms System.out.println("初始大小:" + cache.size()); // 输出: 2 Thread.sleep(1100); System.out.println("1.1秒后大小:" + cache.size()); // 输出: 1(key1被清理) Thread.sleep(1000); System.out.println("2.1秒后大小:" + cache.size()); // 输出: 0(key2被清理) // 关闭定时清理 cache.cancelPruneSchedule(); } }

回到顶部

⚡ 清理时机总结

清理类型触发条件清理范围是否立即生效
惰性清理调用get()、containsKey()等方法只检查被访问的key是
定时清理定时任务触发(需手动调用schedulePrune())所有过期key是
容量清理达到缓存容量上限最近最少使用的过期项是

回到顶部

📊 源码解析

查看TimedCache源码的关键方法:

1.检查过期并移除的方法

// 在get操作时会调用 public V get(K key, boolean isUpdateLastAccess) { CacheObj<K, V> co = getWithoutLock(key); if (co == null) { missCount.increment(); return null; } // 检查是否过期 if (co.isExpired()) { // 过期则移除 remove(key, true); missCount.increment(); return null; } // ... 返回缓存值 }

2.定时清理任务

public void schedulePrune(long delay) { this.pruneTimer.schedule(new TimerTask() { @Override public void run() { pruneCache(); // 执行清理 } }, delay, delay); }

回到顶部

💡 使用建议

1.根据场景选择清理策略

// 场景1:低频率访问,使用惰性清理即可 TimedCache<String, Object> cache1 = new TimedCache<>(5000); // 场景2:高频率访问,需要定时清理避免内存泄漏 TimedCache<String, Object> cache2 = new TimedCache<>(5000); cache2.schedulePrune(1000); // 每1秒清理一次 // 场景3:需要严格内存控制 TimedCache<String, Object> cache3 = new TimedCache<>(5000, 1000); // 容量限制1000 cache3.schedulePrune(500);

2.合理设置过期时间

// 为不同数据设置不同过期时间 TimedCache<String, Object> cache = new TimedCache<>(); // 默认过期时间5秒 cache.setDefaultTimeout(5000); // 特定key设置特定过期时间 cache.put("session_token", "abc123", 30 * 60 * 1000); // 30分钟 cache.put("captcha", "1234", 5 * 60 * 1000); // 5分钟 cache.put("page_cache", "<html>...</html>", 1000); // 1秒

3.监听器支持

TimedCache<String, Object> cache = new TimedCache<>(1000); cache.setListener(new CacheListener<String, Object>() { @Override public void onRemove(String key, Object value) { System.out.println("Key被移除:" + key + ",值:" + value); } });

回到顶部

⚠️ 注意事项

  1. 定时清理需手动启动:schedulePrune()必须显式调用才会启动定时清理
  2. 内存泄漏风险:如果不调用schedulePrune()且从不访问过期key,这些key会一直占用内存
  3. Timer的内存泄漏:定时清理使用Timer,如果缓存对象被GC,定时任务不会自动取消
  4. 性能考虑:定时清理间隔不宜过短,特别是缓存项很多时

回到顶部

🔄 完整生命周期示例

相关新闻

  • ReAct Inside —— 从 Message 到 State,看懂 AI Agent 的工作原理
  • 每日一个开源项目(第145篇):Trellis - 把项目记忆、规范和任务上下文持久化进代码仓库
  • 2026好用的视频去水印工具电脑手机推荐,免费无广告精选

最新新闻

  • 嵌入式低功耗子系统(LFSS)实战:RTC、看门狗与安全监控设计
  • 给Agent压测,别瞎造请求,回放线上日志当样本
  • Java毕设选题推荐:基于 SpringBoot 的毕设任务分配与进度督查系统 高校师生毕设文档审核与进程管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • AI编程助手效率革命:用Skills项目定制专属开发上下文
  • 如何利用MPC Video Renderer实现专业级视频播放优化
  • Java毕设项目: 高校毕业设计全流程信息化管理系统设计与实现 师生协同式毕业文档进度管理系统(源码+文档,讲解、调试运行,定制等)

日新闻

  • 【计算机毕业设计案例】基于 Spring Boot+Vue 的电影售票系统设计与实现 前后端分离架构下影院在线购票管理平台(程序+文档+讲解+定制)
  • 到底 TMD 用哪个: npm, pnpm, Yarn, Bun, Deno? 傻瓜, 当然用 npm 啦
  • Google限制Meta使用Gemini模型 凸显AI授权竞争白热化

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号