首页 > 其他分享 >LRU缓存(超详细注释)

LRU缓存(超详细注释)

时间:2024-04-05 09:29:20浏览次数:17  
标签:node 缓存 next 注释 LRU key prev 节点

/**
 * 表示双向链表中的节点。
 */
class Node {
    constructor(key = 0, value = 0) {
        this.key = key; // 缓存条目的唯一标识符。
        this.value = value; // 与键关联的值。
        this.prev = null; // 引用列表中的上一个节点。
        this.next = null; // 引用列表中的下一个节点。
    }
}

/**
 * 表示 LRU(最近最少使用)缓存。
 */
class LRUCache {
    /**
     * 初始化具有指定容量的 LRUCache。
     * @param {number} capacity - 缓存可以容纳的最大条目数。
     */
    constructor(capacity) {
        this.capacity = capacity; // 缓存的最大容量。
        this.dummy = new Node(); // 双向链表的哨兵节点。
        this.dummy.prev = this.dummy; // 初始化指向自身的上一个指针和下一个指针。
        this.dummy.next = this.dummy;
        this.keyToNode = new Map(); // 映射以存储密钥到节点的映射。
    }

    /**
     * 从缓存中检索与给定密钥关联的节点。
     * 将访问的节点移动到列表的前面。
     * @param {number} key - 在缓存中查找的键。
     * @returns {Node|null} - 具有指定键的节点,如果未找到,则为 null。
     */
    getNode(key) {
        if (!this.keyToNode.has(key)) {
            return null; // 在缓存中找不到密钥。
        }
        const node = this.keyToNode.get(key);
        this.remove(node); //将节点从其当前位置移除。
        this.pushFront(node); // 将节点移动到列表的前面。
        return node;
    }

    /**
     * 从缓存中检索与给定键关联的值。
     * @param {number} key - 在缓存中查找的键。
     * @returns {number} - 与键关联的值,如果未找到,则为 -1。
     */
    get(key) {
        const node = this.getNode(key);
        return node ? node.value : -1;
    }

    /**
     * 将新的键值对添加到缓存中。
     * 如果密钥已存在,请更新值并将节点移动到前面。
     * 如果缓存已满,则删除最近使用最少的节点。
     * @param {number} key - 新条目的键。
     * @param {number} value - 与键关联的值。
     */
    put(key, value) {
        let node = this.getNode(key);
        if (node) {
            // 键已存在,请更新值。
            node.value = value;
            return;
        }
        node = new Node(key, value);
        this.keyToNode.set(key, node); // 将新节点添加到map中。
        this.pushFront(node); // 将新节点移到前面。
        if (this.keyToNode.size > this.capacity) {
            // 缓存已满,删除最近使用最少的节点。
            const backNode = this.dummy.prev;
            this.keyToNode.delete(backNode.key); // 从map中移除。
            this.remove(backNode); // 从列表中删除。
        }
    }

    /**
     * 从列表中删除节点。
     * @param {Node} x - 要删除的节点。
     */
    remove(x) {
        x.prev.next = x.next;
        x.next.prev = x.prev;
    }

    /**
     * 将节点添加到列表的前面。
     * @param {Node} x - 要添加的节点。
     */
    pushFront(x) {
        x.prev = this.dummy;
        x.next = this.dummy.next;
        x.prev.next = x;
        x.next.prev = x;
    }
}

标签:node,缓存,next,注释,LRU,key,prev,节点
From: https://blog.csdn.net/c_studer_/article/details/137325846

相关文章

  • 『VUE』11. 操作数组的方法(详细图文注释)
    目录vue中操作数组的方法会修改原数组的会进行渲染更新不修改原数组的不会进行渲染更新push自动渲染concat赋值渲染总结欢迎关注『VUE』专栏,持续更新中欢迎关注『VUE』专栏,持续更新中vue中操作数组的方法vue中数组数据呈现在网页,只检测一开始用到的数......
  • 『VUE』10. 事件修饰符(详细图文注释)
    目录什么是事件修饰符?vuejs不使用修饰符原生js实现禁用事件对象的默认事件使用事件修饰符.prevent使用事件修饰符.stop使用事件修饰符.self欢迎关注『VUE』专栏,持续更新中欢迎关注『VUE』专栏,持续更新中什么是事件修饰符?vue在Vue.js中,事件修饰符......
  • CSS基础:语法、注释以及注释的3个注意事项
    你好,我是云桃桃。一个希望帮助更多朋友快速入门WEB前端的程序媛。1枚程序媛,大专生,2年时间从1800到月入过万,工作5年买房。分享成长心得。259篇原创内容-公众号后台回复“前端工具”可获取开发工具,持续更新中后台回复“前端基础题”可得到前端基础100题汇总,持续更新中今......
  • 在 PowerShell 中,您可以使用以下命令来管理 DNS 相关的任务以及 DNS 缓存
    在PowerShell中,您可以使用以下命令来管理DNS相关的任务以及DNS缓存:获取当前计算机的DNS客户端配置信息powershellCopyCodeGet-DnsClientGet-DnsClientInterfaceAlias       InterfaceConnectionSpecificSuffixConnectionSpecificSuffixRegi......
  • Redis作为微服务共享缓存的优缺点
    1.引言随着微服务架构的流行,越来越多的系统采用了微服务架构来构建应用程序。在微服务架构中,服务之间需要进行通信和协调,而这些服务通常需要共享一些数据,比如缓存数据。在这种情况下,Redis成为了一个非常受欢迎的选择。然而,使用Redis作为微服务架构中的共享缓存也会带来一些问题......
  • LeetCode-146. LRU 缓存【设计 哈希表 链表 双向链表】
    LeetCode-146.LRU缓存【设计哈希表链表双向链表】题目描述:解题思路一:双向链表,函数get和put必须以O(1)的平均时间复杂度运行。一张图:解题思路二:0解题思路三:0题目描述:请你设计并实现一个满足LRU(最近最少使用)缓存约束的数据结构。实现LRUCache类:LR......
  • 【经典算法】LeetCode 21:合并两个有序链表Java/C/Python3实现含注释说明,Easy)
    合并两个有序链表题目描述思路及实现方式一:迭代(推荐)思路代码实现Java版本C语言版本Python3版本复杂度分析方式二:递归(不推荐)思路代码实现Java版本C语言版本Python3版本复杂度分析总结相似题目标签:字符串处理、前缀判断题目描述将两个升序链表合并为一个新的升......
  • MyBatis<一级二级缓存><缓存更新机制>
    MyBatis<一级二级缓存><缓存更新机制>_二级缓存更新本地缓存-CSDN博客  同一个select,在同一个事务中(同一个sqlsesion对象),会优先从sqlsession缓存中获取。容易出问题的代码:在一个较大的事务中,某个函数A内调用了select,并且对结果进行了操作,比如set。然后在当前函数A中又调用了......
  • 【Redis教程0x0C】数据库与缓存的一致性保证
    1.引言当我们在实现业务的过程中,如果发现服务器的性能瓶颈在数据库时,就要考虑加上Redis,让它作为数据库的缓存了。这样,客户端请求数据时,如果能在缓存命中,就不用去查数据库了,这大大减轻了数据库的压力,提高了服务器性能。那么这里就产生了个问题,我们在数据更新的时候,既需要......
  • Go的数据结构与实现【LRU Cache】
    介绍在本文中,我们将用Go实现LRUCache。LRUCache最近最少使用(LRU)是一种缓存逐出算法,它按使用顺序组织元素。在LRU中,最长时间没有被使用的元素会被从缓存中逐出。例如,如果我们有一个容量为三个项目的缓存:最初,缓存是空的,我们将元素8放入缓存中,元素9和6像以前一样被缓存......