javascript 的 map 本身不支持自动过期,但可通过封装 expiringmap 类实现带 ttl 的键值存储:每个项保存 value 和 expiresat 时间戳,get/set 时按需校验过期并自动清理。

JavaScript 中的 Map 本身不支持自动过期,但可以通过封装一个带定时清理机制的缓存类来实现带过期时间的键值存储。
核心思路:封装 Map + 时间戳 + 定时检查
每次写入时记录当前时间与过期时长,读取时判断是否已过期;也可配合定时器定期清理,避免内存泄漏。
- 每个缓存项保存
{ value, expiresAt },expiresAt是毫秒时间戳 - 读取时先校验是否过期,过期则自动删除并返回
undefined - 写入时支持传入
ttl(毫秒),如set(key, value, 5000)表示 5 秒后过期
简易实现:手动校验过期(推荐)
不依赖定时器,按需检查,更轻量、无内存泄漏风险:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
class ExpiringMap {
constructor() {
this.map = new Map();
}
set(key, value, ttl) {
const expiresAt = Date.now() + ttl;
this.map.set(key, { value, expiresAt });
}
get(key) {
const item = this.map.get(key);
if (!item) return undefined;
if (Date.now() >= item.expiresAt) {
this.map.delete(key);
return undefined;
}
return item.value;
}
has(key) {
const item = this.map.get(key);
if (!item) return false;
if (Date.now() >= item.expiresAt) {
this.map.delete(key);
return false;
}
return true;
}
delete(key) {
return this.map.delete(key);
}
clear() {
this.map.clear();
}
}
// 使用示例
const cache = new ExpiringMap();
cache.set('token', 'abc123', 10000); // 10秒后过期
console.log(cache.get('token')); // 'abc123'
setTimeout(() => {
console.log(cache.get('token')); // 10秒后输出 undefined
}, 11000);
进阶方案:后台自动清理(可选)
适合高频写入、低频读取场景,防止过期项长期堆积。可在构造时启动一个间隔清理任务:
- 用
setInterval每 30~60 秒扫描一次,删除过期项 - 注意:
Map.prototype.forEach遍历时可安全删除当前项 - 为避免频繁触发,建议只在写入量大时启用,小项目无需此逻辑
注意事项与替代建议
实际项目中需权衡复杂度与需求:
- 若需持久化或跨页面共享,
localStorage+ 时间戳更合适,但不支持对象自动序列化 - Node.js 环境可考虑
lru-cache或node-cache等成熟库,内置 TTL 支持 - 高频并发读写时,注意
get中的删除操作是同步的,无竞态问题;但若要求严格原子性,需加锁(通常不需要)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










