LRU算法

lru,算法 · 浏览次数 : 14

小编点评

**实现LRU算法的代码** ```javascript class Lru { constructor(length) { this.length = length; this.data = new Map(); } set(key, value) { if (this.data.has(key)) { this.data.delete(key); } this.data.set(key, value); if (this.data.size > this.length) { const lastKey = this.data.keys().next().value; this.data.delete(lastKey); } } get(key) { if (!this.data.has(key)) { return null; } let value = this.data.get(key); this.data.delete(key); this.data.set(key, value); return value; } } ``` **使用方法** ```javascript const lru = new Lru(5); // 设置数据 lru.set('page1', 'google.com'); lru.set('page2', 'facebook.com'); lru.set('page3', 'youtube.com'); lru.set('page4', 'yahoo.com'); lru.set('page5', 'baidu.com'); // 获取数据 console.log(lru.get('page1')); // 输出 'google.com' // 移除数据 lru.remove('page4'); // 获取数据 console.log(lru.get('page4')); // 输出 null ```

正文

1、什么事LRU

单从代码层面来说,我认为lru算法很容易实现,重点是我们要知道什么是lru算法。
LRU 英文全称是 Least Recently Used,英译过来就是”最近最少使用“的意思,假如我们有一块内存,专门用来缓存我们最近发访问的网页,访问一个新网页,我们就会往内存中添加一个网页地址,随着网页的不断增加,内存存满了,这个时候我们就需要考虑删除一些网页了。这个时候我们找到内存中最早访问的那个网页地址,然后把它删掉。这一整个过程就可以称之为 LRU 算法。如下图所示

2、实现

class Lru {
  constructor(length){
    this.length = length
    this.data = new Map()
  }
  set(key,value){
    if(this.data.has(key)){
      this.data.delete(key)
    }
    this.data.set(key,value)
    if(this.data.size>this.length){
      const lastKey = this.data.keys().next().value;
      this.data.delete(lastKey)
    }
  }
  //移到最前面
  get(key){
    if(!this.data.has(key)){
      return null
    }
    let value = this.data.get(key)
    this.data.delete(key)
    this.data.set(key,value)
    return value
  }

}

与LRU算法相似的内容:

LRU算法

1、什么事LRU 单从代码层面来说,我认为lru算法很容易实现,重点是我们要知道什么是lru算法。 LRU 英文全称是 Least Recently Used,英译过来就是”最近最少使用“的意思,假如我们有一块内存,专门用来缓存我们最近发访问的网页,访问一个新网页,我们就会往内存中添加一个网页地址,

.NET周报 【4月第2期 2023-04-08】

国内文章 LRU缓存替换策略及C#实现 https://www.cnblogs.com/eventhorizon/p/17290125.html 这篇文章讲述了缓存替换策略,特别是LRU算法。LRU算法基于这样一个假设:如果数据最近被访问过,那么将来被访问的几率也更高。通常我们会用双向链表来实现这个

深入解析Redis的LRU与LFU算法实现

重点介绍了Redis的LRU与LFU算法实现,并分析总结了两种算法的实现效果以及存在的问题。

Redis系列19:LRU内存淘汰算法分析

[Redis系列1:深刻理解高性能Redis的本质](https://www.cnblogs.com/wzh2010/p/15886787.html "Redis系列1:深刻理解高性能Redis的本质") [Redis系列2:数据持久化提高可用性](https://www.cnblogs.com/w

Android 内存缓存框架 LruCache 的实现原理,手写试试?

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 前言 大家好,我是小彭。 在之前的文章里,我们聊到了 LRU 缓存淘汰算法,并且分析 Java 标准库中支持 LUR 算法的数据结构 LinkedHashMap。当时,我们使用 LinkedHashMap 实

Lru在Rust中的实现, 源码解析

源码剖析-LRU(Least Recently Used)是一种常用的页面置换算法,其核心思想是选择最近最久未使用的页面予以淘汰。

Lfu缓存在Rust中的实现及源码解析

综上所述,LFU算法通过跟踪数据项的访问频次来决定淘汰对象,适用于数据访问频率差异较大的场景。与LRU相比,LFU更能抵御偶发性的大量访问请求对缓存的冲击。然而,LFU的实现较为复杂,需要综合考虑效率和公平性。在实际应用中,应当根据具体的数据访问模式和系统需求,灵活选择和调整缓存算法,以达到最优的性...

S3-FIFO

S3-FIFO 本文作为下一篇缓存文章的预备知识。 背景 基于LRU和FIFO的驱逐 FIFO和LRU都是经典的缓存驱逐算法,在过去几十年中也出现了很多追求更高效率的驱逐算法,如ARC, 2Q, LIRS, TinyLFU。传统观点认为,基于LRU的缓冲未命中率要低于基于FIFO的算法,如CLOCK

Lru-k在Rust中的实现及源码解析

Lru-k与lru的区别在于多维护一个队列,及每个元素多维护一个次数选项,对于性能的影响不大,仅仅多耗一点cpu,但是可以相应的提高命中率,下一章将介绍LFU按频次的淘汰机制。

LRU缓存替换策略及C#实现

LRU缓存替换策略 缓存是一种非常常见的设计,通过将数据缓存到访问速度更快的存储设备中,来提高数据的访问速度,如内存、CPU缓存、硬盘缓存等。 但与缓存的高速相对的是,缓存的成本较高,因此容量往往是有限的,当缓存满了之后,就需要一种策略来决定将哪些数据移除出缓存,以腾出空间来存储新的数据。 这样的策