Map比普通对象更适合做缓存,因其键支持任意类型(如函数、对象)、迭代有序、无原型属性干扰;SimpleCache类基于Map实现TTL过期控制;LRU可利用Map插入顺序天然特性简化实现。

用 Map 实现缓存,核心是利用其 O(1) 的键值查找性能 和对任意类型键的支持,比普通对象更灵活、更可靠。
为什么 Map 比普通对象更适合做缓存
普通对象的键只能是字符串或 Symbol,而 Map 允许函数、对象、数组甚至 DOM 元素作为键——这对缓存「参数组合」或「实例方法调用结果」非常关键。同时,Map 的迭代顺序与插入顺序一致,且不继承原型属性,避免了意外的 key 冲突(比如 hasOwnProperty 被误当缓存键)。
基础缓存类封装(带过期控制)
一个实用的缓存类需支持设置、获取、删除和自动清理过期项:
- 用
Map存储[key, { value, expiresAt }]结构 - 每次
get前检查是否过期,过期则自动删除并返回undefined -
set支持传入毫秒级 TTL(Time To Live),默认永不过期
示例代码:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
class SimpleCache {
constructor() {
this.cache = new Map();
}
set(key, value, ttl = Infinity) {
const expiresAt = ttl === Infinity ? Infinity : Date.now() + ttl;
this.cache.set(key, { value, expiresAt });
}
get(key) {
const item = this.cache.get(key);
if (!item) return undefined;
if (item.expiresAt !== Infinity && Date.now() > item.expiresAt) {
this.cache.delete(key);
return undefined;
}
return item.value;
}
delete(key) {
return this.cache.delete(key);
}
clear() {
this.cache.clear();
}
}
进阶:LRU 缓存 + Map 的天然优势
Map 的插入顺序保留特性,让 LRU(Least Recently Used)实现变得极简:最新访问的项总在末尾,最久未用的在开头。只需在 get 时重新 set(触发位置更新),set 时检查容量并删除首个元素即可。
- 使用
map.keys().next().value取出最老的 key - 无需额外链表或数组维护顺序
- 所有操作仍保持平均 O(1) 时间复杂度
实际使用注意点
直接用原始值(如数字、字符串)作 key 安全;但用对象或数组作 key 时,要确保引用一致——{a:1} 和 {a:1} 是两个不同 key。若需结构相等判断,应先序列化或生成稳定哈希(如 JSON.stringify 或自定义 key 生成器)。
高频读写场景下,可配合 WeakMap 缓存「仅关联对象生命周期」的数据(如私有元数据),但 WeakMap 不支持遍历和手动清理,不适用于通用缓存。

















