JavaScript中可用Map实现轻量缓存:支持任意类型键、O(1)存取;通过时间戳实现TTL过期(惰性删除);利用Map插入顺序特性模拟LRU淘汰策略;封装为支持最大容量与默认TTL的SimpleCache类。

用 JavaScript 的 Map 实现缓存机制非常直接:利用其键值对存储 + 快速查找的特性,配合手动控制生命周期(比如过期、淘汰),就能构建轻量、可控的内存缓存。
基础缓存:存取 + 命中判断
最简形式就是把 Map 当作带键索引的容器,封装 set 和 get 方法,并返回是否命中:
- 用
map.has(key)判断是否存在,避免undefined误判(比普通对象更可靠) -
map.get(key)直接取值,时间复杂度 O(1) - 插入时用
map.set(key, value),支持任意类型键(如对象、函数、Symbol),这是普通对象做不到的
带过期时间的缓存(TTL)
单纯存值不够,实际常需自动失效。可在存值时记录时间戳,读取时检查是否超时:
- 存入时保存
{ value, expiresAt }对象(expiresAt = Date.now() + ms) - 读取时先检查
expiresAt > Date.now(),不满足则map.delete(key)并返回undefined - 注意:不会自动清理过期项,只在
get时惰性剔除;如需后台清理,可额外加定时器或写入时扫描
限制容量的 LRU 缓存
防止无限增长,可用 Map 的插入顺序特性模拟 LRU(最近最少使用):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- Map 的遍历顺序 = 插入顺序,所以每次
get后调用map.delete(key)再map.set(key, value),就把该键移到末尾 -
set时若 size 超限,用map.keys().next().value取出第一个键(即最久未用),然后delete它 - 这样无需额外数据结构,纯靠 Map 自身行为实现近似 LRU
封装一个实用缓存类示例
把上面逻辑整合成可复用的类,支持 TTL 和最大容量:
class SimpleCache {
constructor(maxSize = 100, defaultTTL = 0) {
this.map = new Map();
this.maxSize = maxSize;
this.defaultTTL = defaultTTL;
}
set(key, value, ttl = this.defaultTTL) {
const item = {
value,
expiresAt: ttl > 0 ? Date.now() + ttl : 0
};
if (this.map.has(key)) this.map.delete(key);
this.map.set(key, item);
if (this.maxSize > 0 && this.map.size > this.maxSize) {
const firstKey = this.map.keys().next().value;
this.map.delete(firstKey);
}
}
get(key) {
const item = this.map.get(key);
if (!item) return undefined;
if (item.expiresAt > 0 && item.expiresAt < Date.now()) {
this.map.delete(key);
return undefined;
}
return item.value;
}
has(key) {
const item = this.map.get(key);
return !!item && (item.expiresAt === 0 || item.expiresAt >= Date.now());
}
clear() {
this.map.clear();
}
}
使用:const cache = new SimpleCache(50, 60_000); cache.set('user:123', user, 30_000);

















