用闭包构建轻量级数据缓存容器,关键在于封装私有状态(Map缓存、过期时间、定时器),仅暴露set/get/clear方法;支持任意key类型、TTL过期控制(惰性检查+主动扫描)、自动清理与LRU容量管理。

用闭包构建轻量级数据缓存容器,关键是把缓存数据、过期逻辑和操作接口全封在一个函数作用域里,对外只暴露 set、get、clear 这三个方法,不依赖任何外部库,也不污染全局环境。
封装私有状态,避免误操作
缓存的核心变量(比如存储数据的 Map、记录过期时间的映射、清理定时器)都定义在外层函数内,内层返回的对象方法通过闭包持续访问它们——这些变量无法被外部直接读写,天然防篡改。
- 推荐用
Map存键值对,支持任意类型 key(包括对象、函数),比普通对象更安全可靠 - 每个 key 对应的过期时间可存在同一 Map 中(如 value 封装为
{ data, expiresAt }),也可另用一个Map单独管理 - 所有时间判断(
Date.now() > expiresAt)只在闭包内部执行,外界看不到时间戳细节
支持过期控制与自动清理
单纯存值不够,必须带 TTL(Time-To-Live)才能真正实用。闭包结构让过期逻辑完全可控:
-
惰性清理:每次
get(key)时先检查是否过期,过期就删掉并返回undefined -
主动扫描:用
setInterval每 30–60 秒遍历一次全部 key,批量清除已过期项 -
清理收口:调用
clear()时记得clearInterval,防止内存泄漏
兼顾稳定性与内存安全
缓存效果好不好,取决于 key 是否稳定、值是否安全、容量是否可控:
- key 必须可序列化且稳定:基础类型(string/number)直接用;对象建议
JSON.stringify(obj),但要避开undefined、函数、循环引用 - 值若是深层对象或数组,
set时做浅拷贝({...obj})或深拷贝(structuredClone),防止外部修改影响缓存一致性 - 若缓存项可能达数百上千,建议叠加 LRU:用数组维护 key 的访问顺序,每次
set或get都把对应 key 移到末尾,超限时删开头
使用方式简洁,开箱即用
把它写成工厂函数,传入毫秒级 TTL,返回标准接口对象:
<!-- 示例 -->
const cache = createTTLCache(60_000); // 60秒过期
cache.set('user:1001', { name: 'Alice', role: 'admin' });
console.log(cache.get('user:1001')); // 返回对象或 undefined
cache.clear();


















