JavaScript实现LRU缓存淘汰算法的详细步骤

 更新时间:2024年12月27日 11:21:09   作者:匹马夕阳  
这篇文章主要介绍了JavaScript实现LRU缓存淘汰算法,下面是用 JavaScript 实现 LRU(Least RecentlyUsed,最近最少使用)缓存淘汰算法的代码,并附上详细的步骤解释,需要的朋友可以参考下

代码实现

class LRUCache {
    constructor(capacity) {
        this.capacity = capacity; // 缓存的最大容量
        this.cache = new Map(); // 使用 Map 来存储缓存数据
    }

    get(key) {
        if (!this.cache.has(key)) {
            return -1; // 如果缓存中没有这个 key,返回 -1
        }

        // 获取值,并将该 key 移动到 Map 的末尾表示最近使用过
        const value = this.cache.get(key);
        this.cache.delete(key); // 先删除 key
        this.cache.set(key, value); // 重新插入 key-value 使其成为最新的

        return value; // 返回找到的值
    }

    put(key, value) {
        if (this.cache.has(key)) {
            // 如果缓存中已经有这个 key,先删除它
            this.cache.delete(key);
        } else if (this.cache.size >= this.capacity) {
            // 如果缓存已满,删除最老的(第一个)元素
            const oldestKey = this.cache.keys().next().value;
            this.cache.delete(oldestKey);
        }

        // 插入新的 key-value
        this.cache.set(key, value);
    }
}

// 示例使用
const lruCache = new LRUCache(2);
lruCache.put(1, 1); // 缓存是 {1=1}
lruCache.put(2, 2); // 缓存是 {1=1, 2=2}
console.log(lruCache.get(1));    // 返回 1,缓存是 {2=2, 1=1}
lruCache.put(3, 3); // 缓存容量已满,淘汰最老的键 2,缓存是 {1=1, 3=3}
console.log(lruCache.get(2));    // 返回 -1(未找到)
lruCache.put(4, 4); // 缓存容量已满,淘汰最老的键 1,缓存是 {3=3, 4=4}
console.log(lruCache.get(1));    // 返回 -1(未找到)
console.log(lruCache.get(3));    // 返回 3,缓存是 {4=4, 3=3}
console.log(lruCache.get(4));    // 返回 4,缓存是 {3=3, 4=4}

代码解释

  • 初始化缓存

class LRUCache {
    constructor(capacity) {
        this.capacity = capacity; // 缓存的最大容量
        this.cache = new Map(); // 使用 Map 来存储缓存数据
    }
}
    • capacity 表示缓存的最大容量。
    • cache 使用 Map 数据结构来存储缓存内容。
  • 获取缓存内容

get(key) {
    if (!this.cache.has(key)) {
        return -1; // 如果缓存中没有这个 key,返回 -1
    }

    // 获取值,并将该 key 移动到 Map 的末尾表示最近使用过
    const value = this.cache.get(key);
    this.cache.delete(key); // 先删除 key
    this.cache.set(key, value); // 重新插入 key-value 使其成为最新的

    return value; // 返回找到的值
}
    • 检查缓存中是否存在指定的 key
    • 如果存在,将该 key 移动到 Map 的末尾,表示最近使用过。
  • 插入缓存内容

put(key, value) {
    if (this.cache.has(key)) {
        // 如果缓存中已经有这个 key,先删除它
        this.cache.delete(key);
    } else if (this.cache.size >= this.capacity) {
        // 如果缓存已满,删除最老的(第一个)元素
        const oldestKey = this.cache.keys().next().value;
        this.cache.delete(oldestKey);
    }

    // 插入新的 key-value
    this.cache.set(key, value);
}
    • 如果缓存中已经存在 key,删除旧的 key
    • 如果缓存容量达到上限,删除最老的元素。
    • 插入新的 key-value 对。

使用示例

const lruCache = new LRUCache(2);
lruCache.put(1, 1); // 缓存是 {1=1}
lruCache.put(2, 2); // 缓存是 {1=1, 2=2}
console.log(lruCache.get(1));    // 返回 1,缓存是 {2=2, 1=1}
lruCache.put(3, 3); // 缓存容量已满,淘汰最老的键 2,缓存是 {1=1, 3=3}
console.log(lruCache.get(2));    // 返回 -1(未找到)
lruCache.put(4, 4); // 缓存容量已满,淘汰最老的键 1,缓存是 {3=3, 4=4}
console.log(lruCache.get(1));    // 返回 -1(未找到)
console.log(lruCache.get(3));    // 返回 3,缓存是 {4=4, 3=3}
console.log(lruCache.get(4));    // 返回 4,缓存是 {3=3, 4=4}

以上代码实现了一个简单的 LRU 缓存算法,使用 Map 数据结构来存储缓存内容,并通过操作 Map 实现最近最少使用的更新策略。

LRU(Least Recently Used,最近最少使用)缓存算法是一种常见的缓存替换策略,广泛应用于各种领域。

主要的应用场景:

  1. 操作系统中的页面置换

    • 在操作系统的虚拟内存管理中,LRU 算法用于决定在内存不足时,哪一页(page)应该被置换出内存。
    • 通过淘汰最近最少使用的页面,可以提高内存的利用效率和系统的性能。
  2. 数据库缓存

    • 数据库系统会使用缓存来加速查询操作。
    • LRU 算法可以用于管理数据库缓存中的数据块,确保最常用的数据优先保留在缓存中,提高查询效率。
  3. 浏览器缓存

    • 浏览器会缓存用户访问过的网页资源(如图片、CSS 文件、JavaScript 文件等)。
    • 使用 LRU 算法可以有效管理这些缓存资源,使得用户在回访时能更快地加载网页。
  4. 内容分发网络(CDN)

    • CDN 会缓存常用的内容以减少服务器负载和提高用户访问速度。
    • LRU 算法用于管理这些缓存内容,确保最常访问的资源保留在 CDN 的缓存中。
  5. 网络路由器缓存

    • 路由器会缓存最近访问过的路由信息以加速数据包的转发。
    • 使用 LRU 算法可以有效管理路由器缓存,减少查找延迟。
  6. 文件系统缓存

    • 文件系统会缓存最近访问的文件或目录信息。
    • LRU 算法用于管理这些缓存,提高文件访问的速度。
  7. 应用程序中的数据缓存

    • 各种应用程序(如 Web 应用、移动应用等)都会使用缓存来存储临时数据。
    • 使用 LRU 算法可以有效管理这些缓存数据,提升应用性能。
  8. 硬件缓存(如 CPU 缓存)

    • 在计算机硬件中,CPU 缓存用于加速数据读取和写入操作。
    • LRU 算法可以用于管理缓存中的数据块,确保最常用的数据保留在高速缓存中,提高处理器的效率。

这些应用场景中,LRU 算法通过淘汰最近最少使用的缓存数据,确保缓存中的数据尽可能是常用的数据,从而提高系统的性能和效率。

到此这篇关于JavaScript实现LRU缓存淘汰算法的代码详解的文章就介绍到这了,更多相关JavaScript LRU缓存淘汰算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript中数组sort()方法的基本使用与踩坑记录

    JavaScript中数组sort()方法的基本使用与踩坑记录

    : js中用方法sort()为数组排序,这篇文章主要给大家介绍了关于JavaScript中数组sort()方法的基本使用,sort()方法已经可以满足我们对数组的很多处理需求,需要的朋友可以参考下
    2021-06-06
  • electron实现qq快捷登录的方法示例

    electron实现qq快捷登录的方法示例

    这篇文章主要介绍了electron实现qq快捷登录的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • js实现在网页上简单显示时间的方法

    js实现在网页上简单显示时间的方法

    这篇文章主要介绍了js实现在网页上简单显示时间的方法,实例分析了javascript实时显示时间的技巧,需要的朋友可以参考下
    2015-03-03
  • 用JavaScript操作WinRar

    用JavaScript操作WinRar

    Blog的插入HTML功能有誤。 原來在blueidea.com上看到了用ASP執行解壓縮動作的文章,一直沒有去用心看,前日,趁老大不在,爽了一把,把它改成了用JavaScript操作的了。
    2008-04-04
  • JS+CSS3制作炫酷的弹窗效果

    JS+CSS3制作炫酷的弹窗效果

    本文给大家分享使用js和css3制作的炫酷弹窗效果,整个背景模糊,要比纯色加透明度高大上好多。对js弹窗效果感兴趣的朋友一起学习吧
    2016-11-11
  • 微信小程序实现商品分类列表

    微信小程序实现商品分类列表

    这篇文章主要为大家详细介绍了微信小程序实现商品分类列表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • ajaxControlToolkit AutoCompleteExtender的用法

    ajaxControlToolkit AutoCompleteExtender的用法

    昨天在搜索中使用了这个控件,不过不知道为什么在IE中反应比较慢
    2008-10-10
  • PyQt中QLabel标签组件使用指南

    PyQt中QLabel标签组件使用指南

    QLabel是PyQt中用于显示文本和图像的组件,本文详细介绍了其基本用法和高级特性,首先,介绍如何创建QLabel,以及如何用它来显示图像,接着,探讨了如何使用HTML标签格式化文本,设置文本对齐方式,以及如何实现自动换行
    2024-10-10
  • 浅谈javascript的Array.prototype.slice.call

    浅谈javascript的Array.prototype.slice.call

    发现大多人都用了Array.prototype.slice.call(argments,0),一直不明白这句是干什么的。而昨天温习了slice()方法,再参考Function.call(thisArg[, arg1[, arg2[, ...]]]),还是不得而知(我脑筋转得慢:|)。
    2015-08-08
  • Javascript新手入门之字符串拼接与变量的应用

    Javascript新手入门之字符串拼接与变量的应用

    这篇文章主要给大家介绍了关于Javascript新手入门之字符串拼接与变量应用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论