js实现lru缓存的核心是利用map对象的插入顺序特性,通过在每次访问或更新时将键值对重新插入map末尾,使map头部始终为最近最少使用的数据,当缓存满时删除头部元素即可实现lru策略,该方案具有o(1)的时间复杂度,优于使用object的实现,广泛应用于数据库查询缓存、api响应缓存、静态资源管理和函数结果记忆等场景,以提升性能并减少重复开销。

JS实现LRU缓存,核心在于利用JavaScript
Map
Map
Map
Map
要构建一个高效的LRU缓存,我们通常会封装一个类。这个类需要一个
Map
class LRUCache {
constructor(capacity) {
this.cache = new Map();
this.capacity = capacity;
}
get(key) {
if (!this.cache.has(key)) {
return -1; // 或者 null/undefined,表示未找到
}
// 获取值并更新其在Map中的位置,使其成为最近使用的
const value = this.cache.get(key);
this.cache.delete(key);
this.cache.set(key, value);
return value;
}
put(key, value) {
// 如果key已存在,先删除旧的,再插入新的,确保其在Map末尾(最近使用)
if (this.cache.has(key)) {
this.cache.delete(key);
} else if (this.cache.size >= this.capacity) {
// 如果缓存已满,且key不存在,则淘汰最近最少使用的(Map的第一个元素)
// Map的keys()迭代器会按照插入顺序返回键
const oldestKey = this.cache.keys().next().value;
this.cache.delete(oldestKey);
}
// 插入或更新新值,使其成为最近使用的
this.cache.set(key, value);
}
// 辅助方法,用于查看缓存内容,非LRU核心功能
peek() {
return Array.from(this.cache.entries());
}
}
// 示例用法:
// const lruCache = new LRUCache(3);
// lruCache.put('a', 1); // cache: {a: 1}
// lruCache.put('b', 2); // cache: {a: 1, b: 2}
// lruCache.put('c', 3); // cache: {a: 1, b: 2, c: 3}
// console.log(lruCache.get('b')); // 2; cache: {a: 1, c: 3, b: 2} - b被访问,移到末尾
// lruCache.put('d', 4); // cache: {c: 3, b: 2, d: 4} - a被淘汰,因为它是最近最少使用的
// console.log(lruCache.peek()); // [[c, 3], [b, 2], [d, 4]]这段代码的核心思想是:无论是
get
put
Map
Map
Map
Map
Map
Object
Map
在我看来,选择
Map
Object
首先,
Object
Map
更关键的区别在于,
Map
Map
Map.keys()
Map.values()
Map.entries()
Map
反观
Object
Object
Map
Object
Map
delete
set
get
put
所以,综合来看,
Map
Object
LRU缓存的用处非常广泛,简直是性能优化和资源管理的好帮手。它主要解决的问题是:如何在有限的内存空间内,尽可能地提升数据访问速度,减少重复计算或IO操作。
我个人接触过的几个典型应用场景:
本质上,LRU缓存就像一个“临时仓库”,它只保留那些“最有可能被再次使用”的物品。当仓库满了,它就毫不犹豫地扔掉那些“最长时间没人碰过”的物品。这种策略在很多场景下都非常符合实际需求,因为它假设“最近被访问过的数据,在未来也很有可能再次被访问”。
除了LRU,缓存世界里还有不少其他的淘汰策略,每种都有其特定的适用场景,就像不同的工具箱,解决不同的问题。
FIFO (First-In, First-Out,先进先出):
LFU (Least Frequently Used,最不常用):
ARC (Adaptive Replacement Cache,自适应替换缓存):
MRU (Most Recently Used,最近最常使用):
选择哪种策略,说到底,就是根据你的数据访问模式和对性能、内存的权衡来决定的。LRU之所以流行,是因为它在大多数通用场景下都表现良好,并且实现相对简单高效。
以上就是JS如何实现LRU缓存?LRU的淘汰策略的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号