首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

算法LFU最近最少使用算法原理分析和编码实战

什么是LFULeast Frequently Used 最近最少使用,表示以次数为参考,淘汰一定时期内被访问次数最少的数据如果数据过去被访问多次,那么将来被访问的频率也更高比LRU多了一个频次统计,需要时间和次数两个维度进行判断是否淘汰关键流程新加入数据插入到队列尾部...,需要吧引用计数初始值为 1当队列中的数据被访问后,对应的元素引用计数 +1,队列按【次数】重新排序,如果相同次数则按照时间排序当需要淘汰数据时,将排序的队列末尾的数据删除,即访问次数最少图片编码实战public...//定义缓存容量 private int capacity; //定义存储key,value数值 private Map cacheValue; //存储key的使用频次...++ public V get(K key) { V value = cacheValue.get(key); //如果key获取的value不为空,则对这个key的使用次数...key; this.count = count; this.lastTime = lastTime; } //用于比较大小,如果使用次数一样

53200
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    最近最少使用的缓存机制,完整实现

    你好,我是zhenguo 今天结合一道leetcode有意思的题目,设计和实现一个 LRU (最近最少使用) 缓存机制,顺便和读者们加强下双向链表、字典这些数据结构的应用能力。...链表增删操作时间复杂度都是O(1),这是它最强的地方,尤其追求卓越性能的算法场景,应用广泛。同时,在面试中也经常会考察到。但是,链表比较容易出错,如果在项目中应用,务必要多多测试。...1 问题 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。...问题涉及的主要操作包括: (1). put操作 加入键值对分两种情况讨论: (1).1 键不存在 (1).2 键存在 (2).get操作,get操作除了具备dict.get的功能外,此处需要定制一个新的功能,即最近使用的节点需要移动到热点区域...牢固的掌握链表才算是深度掌握算法和数据结构的第一步。

    75420

    【软考学习13】图解页面淘汰算法,先进先出算法最近最少使用算法

    本文讲解了操作系统中进程读内存时,维护高速缓存的页面淘汰算法,其中重点讲解了先进先出算法最近最少使用算法,学习高速缓存 Cache 提高程序执行效率的原理。...常用的页面淘汰算法有四种:最优算法、随机算法、先进先出算法最近最少使用算法。...---- 三、 最近最少使用算法 最近最少使用算法是每次淘汰最低频使用的数据。 这种算法不会出现倒挂现象(抖动现象)。...根据最近最少使用算法,1 2 3 三个数据最近最常使用的是 3,其次是 2,所以淘汰掉数据 1,如下图所示。...在数据 2 和 3 中,虽然都使用了 2 次,但数据 2 比数据 3 更最近使用,所以数据 3 淘汰,这就是**【最近】【最少使用算法**,结果如下图所示。

    59120

    合适以及为何使用最少使用(LFU)缓存与Golang中的实现

    [译]合适以及为何使用最少使用(LFU)缓存与Golang中的实现 在过去的这些年,参与计算机科学和工程师的人们一直在努力优化各种性质。...对最不常用的缓存采取特定的实现方法,并使成员资格测试和驱逐算法具有良好的性能。并且,我们还将介绍基础知识并探究这种缓存方案可用的地方。 基础 LFU是一种缓存算法。...这意味着对于缓存中的每个项目,我们必须跟踪它的使用频率。一旦超过了容量,讲运用驱逐算法,从缓存中挑选和过期(移除)项目。 如果你之前实现过LFU缓存,你可能已经考虑使用最小堆数据结构。...这种资产缓存是LFU缓存的完美用例。LFU缓存逐出算法永远不会驱逐频繁访问的资产。事实上,在这样的缓存中,谷歌的微标几乎将永远缓存,相比之下。...虽然LRU缓存将驱逐最近无法访问的资产,但LFU驱逐方法将在炒作结束后逐出不再需要的资产。 实现LFU缓存 现在,让我们来了解它,如我们之前所说的。

    2.2K31

    LFU算法实现

    LFU (Least Frequently Used) 是一种用于缓存管理的算法。它通过跟踪每个缓存项被访问的频率来决定哪些项应该被移除。...LFU算法倾向于保留那些使用频率较高的项,而移除那些使用频率较低的项。以下是LFU算法的详细介绍:工作原理计数器:每个缓存项都有一个计数器,用于记录该项被访问的次数。...实现LFU算法的实现可以使用多种数据结构,如哈希表、双向链表和优先队列。以下是一种常见的实现方法:使用哈希表和优先队列:哈希表 (cache):用于存储缓存项及其计数器。...应用场景LFU算法适用于以下场景: 数据访问具有明显的热点数据,且热点数据相对稳定。需要高效管理缓存资源,减少缓存未命中率。...intminFreq intcache map[any]*list.Elementfrequency map[int]*list.List}// NewLFUCache creates a new LFU

    12210

    LFU】一文让你弄清 Redis LFU 页面置换算法

    上一次,相信大家已经知道关于 LRU 页面置换算法的思想和实现了,这里可以一键直达: 【LRU】一文让你弄清 Redis LRU 页面置换算法 Redis 的淘汰策略中,关于 LFU 页面置换算法,今天咱们来捋一捋到底思想是啥...,可以如何去实现它 这就让我们进入状态吧 ✔LFU 的思想和实现 LFU 全称为:Least frequently used 含义为:使用频次最少的,即为 最不经常使用的 思想是:如果数据在一段时间被访问的次数较少...,那么在未来的一段时间,这段数据被访问的几率就会更小 可以看到 LRU 和 LFU 思想上的区别是非常明显的 LRU 强调最近最少使用,关注的是最近有没有使用LFU 强调的是一段时间的使用次数,关注的是频次...的实现时用一个双向链表,插入数据使用头插法,从尾部淘汰数据 那么 LFU 的实现实际上是使用了 2 个 hashmap 和 多个 双向链表,插入数据使用尾插法,淘汰数据从链表头淘汰 ✔举例时刻 还是同样的方法...LRU 和 LFU 页面置换算法的思想,演示,以及具体实现都聊了一下,如果有偏差, 还请提出,兄弟们不吝赐教哦 感兴趣的,随时可以下载源码,在你的机器上运行哦,仓库地址如下: https://github.com

    20130

    高效缓存神器:简析最近最少使用(MRU)缓存模板及实践

    链表的顺序按照项目的使用频率排序,最近使用的项目在链表的前面,最少使用的项目在链表的后面。...设计细节 插入操作:当插入新的项目时,如果缓存已满(即达到了指定的最大大小),则会自动删除最少使用的项目。...正向迭代从最近的项目开始,向后进行。反向迭代从最少使用的项目开始,向前进行。...总结 本文详细介绍了一个实现了最近最少使用(MRU)缓存的模板,它具有易读性和高效性。...通过简洁的设计,该模板提供了插入、获取、删除和清空缓存的方法,并支持自动驱逐最近最少使用的项目,以保持缓存大小在指定范围内。此外,还提供了一个基于哈希表的变体,以提供更快的查找速度。

    14110

    LFU】一文让你弄清 Redis LFU 页面置换算法

    上一次,相信大家已经知道关于 LRU 页面置换算法的思想和实现了,这里可以一键直达: 【LRU】一文让你弄清 Redis LRU 页面置换算法 Redis 的淘汰策略中,关于 LFU 页面置换算法,今天咱们来捋一捋到底思想是啥...,可以如何去实现它 这就让我们进入状态吧 ✔LFU 的思想和实现 LFU 全称为:Least frequently used 含义为:使用频次最少的,即为 最不经常使用的 思想是:如果数据在一段时间被访问的次数较少...,那么在未来的一段时间,这段数据被访问的几率就会更小 可以看到 LRU 和 LFU 思想上的区别是非常明显的 LRU 强调最近最少使用,关注的是最近有没有使用LFU 强调的是一段时间的使用次数,关注的是频次...的实现时用一个双向链表,插入数据使用头插法,从尾部淘汰数据 那么 LFU 的实现实际上是使用了 2 个 hashmap 和 多个 双向链表,插入数据使用尾插法,淘汰数据从链表头淘汰 ✔举例时刻 还是同样的方法...LRU 和 LFU 页面置换算法的思想,演示,以及具体实现都聊了一下,如果有偏差, 还请提出,兄弟们不吝赐教哦 感兴趣的,随时可以下载源码,在你的机器上运行哦,仓库地址如下: https://github.com

    30930

    【技术干货】淘汰算法LRU与LFU

    LRU算法 定义 「LRU」算法中,需要有一个链表来存放数据,当某个元素被访问时,这个元素会被移动到表头。当空间满了,会剔除掉链表末尾的元素。 其核心就是保留最近使用的元素。...顺序为:C ->B ->D ->E ❞ LFU算法 定义 在「Redis」 4.0中引入了一个新的淘汰算法LFU,可以说是LRU的进阶版。...LFU算法规定的是按最近访问的频率进行淘汰,与LRU算法相比,LFU更精准的表示了一个「key」被访问的热度。 为甚么Redis要引入LFU算法呢?...在LRU算法下,这个「key」是不容易被淘汰的。但如果是LFU算法,会追踪最近一段时间的访问频率。就是说在LFU算法下,只是最近偶尔被访问一次是不足以说明这个「key」是热点数据。...LRU算法LFU算法有各自的特点,我们应该根据实际业务使用情况去使用

    32920

    缓存算法(页面置换算法)-FIFO、LFU、LRU

    2.LFU算法   LFU(Least Frequently Used)最近最少使用算法。它是基于“如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小”的思路。   ...注意LFU和LRU算法的不同之处,LRU的淘汰规则是基于访问时间,而LFU是基于访问次数的。...为了能够淘汰最少使用的数据,因此LFU算法最简单的一种设计思路就是 利用一个数组存储 数据项,用hashmap存储每个数据项在数组中对应的位置,然后为每个数据项设计一个访问频次,当数据项被命中时,访问频次自增...,在淘汰的时候淘汰访问频次最少的数据。...3.LRU算法 LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。

    2.7K10

    常用缓存淘汰算法LFU、LRU、ARC、FIFO、MRU)

    缓存算法是指令的一个明细表,用于决定缓存系统中哪些数据应该被删去。 常见类型包括LFU、LRU、ARC、FIFO、MRU。...最不经常使用算法LFU): 这个缓存算法使用一个计数器来记录条目被访问的频率。通过使用LFU缓存算法,最低访问数的条目首先被移除。...这个方法并不经常使用,因为它无法对一个拥有最初高访问率之后长时间没有被访问的条目缓存负责。 最近最少使用算法(LRU): 这个缓存算法最近使用的条目存放到靠近缓存顶部的位置。...自适应缓存替换算法(ARC): 在IBM Almaden研究中心开发,这个缓存算法同时跟踪记录LFU和LRU,以及驱逐缓存条目,来获得可用缓存的最佳使用。...最近最常使用算法(MRU): 这个缓存算法最先移除最近最常使用的条目。一个MRU算法擅长处理一个条目越久,越容易被访问的情况。

    4.4K60

    Redis内存回收策略

    true LRU but costs more CPU. 3 is faster but not very accurate. # # maxmemory-samples 5 volatile-lru:采用最近使用最少的淘汰策略...allkeys-lru:采用最近最少使用的淘汰策略,Redis将对所有(不仅仅是超时的)的键值对采用最近最少使用的淘汰策略。...volatile-lfu:采用最近最不常用的淘汰策略,所谓最近最不常用,也就是一定时期内被访问次数最少的。Redis将回收超时的键值对。...allkeys-lfu:采用最近最不常用的淘汰策略,Redis将对所有的键值对采用最近最不常用的淘汰策略。 volatile-random:采用随机淘汰策略删除超时的键值对。...LRU算法或者TTL算法都是不精确的算法,而是一个近似算法。 Redis不会通过对全部的键值对进行比较来确定最精确的时间值,因为这太消耗时间,导致回收垃圾占用的时间太多造成服务器卡顿。

    2.5K20

    动手实现 LRU 算法,以及 Caffeine 和 Redis 中的缓存淘汰策略

    运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。...LRU 全名 Least Recently Used,意为最近最少使用,注重最近使用的时间,是常用的缓存淘汰策略。...保证维护最近最少使用的顺序。LinkedHashMap这种结构非常适合构造 LRU 缓存。 当我看到这段注释的时候,特意去查了一下用 LinkedHashMap实现 LRU 的方法。...volatile-ttl:从配置了过期时间的键中驱逐马上就要过期的键 volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键 allkeys-lfu:从所有键中驱逐使用频率最少的键...,每次随机选出5(默认)个key,从里面淘汰掉最近最少使用的key。

    79630

    蚂蚁金服在线笔试:设计和实现一个LRU(最近最少使用)缓存机制

    这道中等算法题,一开始没写出来 这是胖头鱼面试蚂蚁金服时的一道在线笔试题,当时看到题目我就懵逼了,潜意识里感觉它很难,题目又长,内心打起了退堂鼓。结果自然是没有写出来......做算法题的一些小经验 遇到不会的题时,千万不能慌,一定要稳住心神,从题目中找出更多有效的信息,并尝试多画图,多动笔(如果是现场面试,记得带只笔,多画画有时候思路就出来了) 画图是解题非常有效的方式之一...画图是解题非常有效的方式之一 看看题目 leetCode(https://leetcode-cn.com/problems/lru-cache/) 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用...题目要求的1和2相对简单,主要是条件3,当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值。容量和条件1相呼应,关键是怎么理解最久未使用呢?...读和写都在使用数据,最久未使用就是容量达到上线时,最久没读也没写的那个key。还是太生涩了,来画个图试试。

    71520

    Redis的数据过期清除策略 与 内存淘汰策略

    7、allkeys-lru:在所有的键值对中,移除最近最少使用的键值对。...三、Redis中的LRU和LFU算法: 1、LRU算法: LRU 算法的全称是 Least Recently Uses,按照最近最少使用的原则来筛选数据,最不常用的数据会被筛选出来。...它的使用与LRU有所区别: LFU (Least Frequently Used) :最近最不频繁使用,跟使用的次数有关,淘汰使用次数最少的。...LRU (Least Recently Used):最近最少使用,跟使用的最后一次时间有关,淘汰最近使用时间离现在最久的。...LRU的最近最少使用实际上并不精确,考虑下面的情况,如果在 “|” 处删除,那么A距离的时间最久,但实际上A的使用频率要比D频繁,所以合理的淘汰策略应该是淘汰D。LFU就是为应对这种情况而生的。

    1.1K31

    Redis缓存淘汰策略

    volatile-lru 会使用 LRU 算法(下文具体介绍)筛选设置了过期时间的键值对。 volatile-lfu使用 LFU 算法(下文具体介绍)选择设置了过期时间的键值对。...allkeys-lru 策略,使用 LRU 算法在所有数据中进行筛选。 allkeys-lfu 策略,使用 LFU 算法在所有数据中进行筛选。 通常情况下推荐优先使用 allkeys-lru 策略。...Redis中的LRU和LFU算法 LRU算法 LRU 算法的全称是 Least Recently Used,从名字上就可以看出,这是按照最近最少使用的原则来筛选数据,最不常用的数据会被筛选出来,而最近频繁使用的数据会留在缓存中...LFU算法 LFU是在Redis4.0后出现的,LRU的最近最少使用实际上并不精确,考虑下面的情况,如果在|处删除,那么A距离的时间最久,但实际上A的使用频率要比B频繁,所以合理的淘汰策略应该是淘汰B。...LFU就是为应对这种情况而生的。 LFU (Least Frequently Used) :最近最少使用,跟使用的次数有关,淘汰使用次数最少的。

    1.9K50

    Redis技术知识总结之三——Redis数据淘汰机制

    Redis 早起版本使用的数据淘汰策略是 LRU (Least Recently Used,最近最少使用) 策略,LRU 策略是基于最近访问时间进行排序、淘汰的。...后来加入了 LFU (Least Frequency Used,最近最低频率) 策略。 Redis 主要使用的还是 LRU 策略。 noeviction: 可以继续读请求,不可以进行写请求。...volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在设置了过期时间的键,使得新添加的数据有空间存放。...allkeys-lru: 对全部集合进行回收,尝试回收最少使用的键 (LRU),使得新添加的数据有空间存放。...列表按照最近访问时间进行排序。当内存达到物理内存限制触发 LRU 回收时,对链表尾部的 k-v 进行回收。 但 Redis 的 LRU 并不是这样执行的,Redis 使用了一种近似 LRU 算法

    72110
    领券