用闭包封装 TTL 管理的 Map 缓存,支持惰性清理与定时扫描双模式,隔离过期时间戳等私有状态,兼顾 key 稳定性、内存安全及可选 LRU 容量控制。
用 Map 配合闭包实现带过期清理的本地缓存,核心在于:用闭包封装私有状态(如 TTL、定时器、清理逻辑),让 Map 仅负责存储,而生命周期管理完全由闭包控制。这种方式轻量、无依赖、可复用,且避免了原生 Map 缺失 TTL/LRU 的短板。
闭包封装过期逻辑,隔离内部状态
闭包天然适合隐藏缓存元数据(如过期时间戳、清理任务引用),防止外部误操作。例如:
- 定义一个工厂函数 createTTLCache(ttlMs),返回 { set, get, clear } 方法对象
- 内部用 Map 存键值对,另用一个 Map(或 WeakMap)单独存每个 key 的 expiresAt 时间戳
- 所有时间判断、删除动作都在闭包内完成,外界只能通过暴露的方法交互
支持惰性清理 + 主动定时清理双模式
只靠 get 时检查过期是不够的——长期不访问的脏数据会堆积。闭包中应同时支持:
-
惰性清理:get 时发现过期,立即 delete(key),不返回值
-
主动定时清理:用 setInterval 或 setTimeout 启动后台扫描(注意用 clearInterval / clearTimeout 管理引用,防泄漏)
- 推荐策略:每 30 秒扫描一次,遍历所有 key,批量删除已过期项(比单次 setTimeout 更可控)
确保 key 稳定性与引用安全
闭包能帮你规避常见陷阱,但需主动设计:
- key 必须是原始值(string/number/symbol)或可序列化的稳定结构(如 JSON.stringify({ a, b })),避免用对象/函数作 key(引用每次不同)
- 若缓存大对象(如数组、嵌套对象),在 clear 或组件卸载时显式调用清理方法,防止内存滞留
- 在前端 React/Vue 中,不要把缓存实例写在渲染函数里;应放在模块顶层或 useRef/useMemo 初始化一次
可选增强:容量限制 + LRU 淘汰
纯 TTL 不解决内存爆满问题。可在同一闭包中叠加容量控制:
- 维护一个 accessOrder 数组或用 Map 记录最近访问顺序(set/get 时更新)
- 每次 set 前检查 size,超限时按 accessOrder 弹出最久未用的 key
- 注意:LRU 和 TTL 可共存——先淘汰过期项,再按 LRU 控制容量