一种LFU淘汰算法

LFU算法】的实现——Java 什么是LFU算法LFU算法淘汰的是使用频率最小的 它的名字是:Least Frequently Used algorithm 既然是跟频率有关的,那么就需要用数据结构来存放key-频率。 怎么写? 首先,列举基本的需求 在调用get(key)时,返回对应的value get 或 put 之后,这个key的频率 +1; 如果在容量满的时候进行put操作,那么就要删除频率最低的(通过频率找到key),如果有多个频率相同,删除最老的那个 以上操作希望是**O(1)**时间复杂度 根据要求 阅读详情

以前介绍过LRU高效的实现方式:

一种O1性能的LRU算法 http://blog.csdn.net/herm_lib/article/details/6535698


今天也介绍一下LFU的实现方法。LRU是最近最少使用算法,就是把最早才访问的数据淘汰掉。LFU是最近最不常用算法,就是某一段时间内被用到最少的淘汰掉。


LFU时间周期

        使用次数的时间长度,这个时间不能太短,短了体现不出哪些数据是热点;同样也不能太长,太长的话,某一个时间点的对某个数据的访问峰值可以长期影响我们的淘汰策略。一般实现的算法可以根据业务特点去调节这个参数。

上个周期访问次数权重

        在本周期开始的时候,最粗暴的做法是把所有数据的访问数据全置成0。这样上次的访问热点就体现不出来了。考虑引入一个可调整的权重,这个权重一般建议与访问次数成反比的关系。


这个算法实现比LRU稍微简单一点。

数据访问次数数组

        数组内容是数据索引+访问次数,这个数组做成线性有序数组,按访问次数降序排列。

哈希表

        数据索引作为Key,指向数据访问时间数组的下标。


访问cache

        查哈希表,查到,返回数据。根据哈希表的值(就是上面的数组下标),定位到数组元素,将数组元素访问次加1,然后和后面元素做调整。

        没查到,数据不在cache中。如果cache未满,把该数据索引加到访问次数数组的尾部。

        满了,就要淘汰了,直接把访问次数数组的最后一个元素对应的数据淘汰掉;把新数据加到哈希表,同事将访问次数元素加到数组尾部。


对整个cache启动一个以LFU时间周期长度的定时器,定时时间到,就整个cache访问数组的访问次数按权重降低。另外,如果某个数据的访问次数达到最大值了,所有的访问次数也按权重降低。权重降低是一个对整个访问次数数组的遍历过程,但一般这个周期时间不会太短(至少分钟级),而且降权重过程时间很短(100W个数据约10ms),整个过程不会产生CPU和内存访问的峰值。





LRU LFU 概念、底层原理及其实现 超详细~ 计算机的运行的程序和数据保存在内存中,内存的空间是有限的,所运行的程序可能需要新的数据,而数据不在内存,在磁盘(硬盘)中。CPU 访问的页面在物理内存时,便会产生一个缺页中断,请求操作系统将所缺页调⼊到物理内存。对于要新加入内存的页面,需要一定的算法来确定把哪个页面剔除出去给新的要加进来的页面让位。所以,页面置换算法的功能是,当出现缺页异常,需调入新页面而内存已满时,选择被置换的物理页面,也就是说选择⼀个物理页面换出到磁盘,然后把需要访问的页面换入到物理页。那其算法目标则是,尽可 阅读详情

相关推荐

吃透Redis(九):缓存淘汰篇-LFU算法

Redis 在 4.0 版本后,还引入了 LFU 算法,也就是最不频繁使用(Least Frequently Used,LFU算法LFU 算法在进行数据淘汰时,会把最不频繁访问的数据淘汰掉。而 LRU 算法是把最近最少使用的数据淘汰掉,看起来也是淘汰不频繁访问的数据。那么,LFU 算法和 LRU 算法的区别到底有哪些呢?我们在实际场景中,需要使用 LFU 算法吗?

吃透Java 4132

缓存淘汰算法--LFU算法

https://blog.csdn.net/qq_32198277/article/details/79773695 LFU(Least Frequently Used)淘汰一定时期内被访问次数最少的元素。如果元素的一定时间内的访问次数相同时,则比较他们的最新一次的访问时间。 public class LFU<k, v> { private final int capcity...

z69183787的专栏 933

基于JavaEE的银行大客户关系维护系统(JSP+java+springmvc+mysql+MyBatis)

基于JavaEE技术的大型银行客户关系管理系统可以实现客户信息的集中管理、客户需求的分析与挖掘、个性化的服务推荐等功能。+ Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。用户发送请求:用户通过浏览器或其他客户端向系统发送请求,请求访问特定的页面或执行特定的操作。前端展示结果:前端接收到后端返回的数据,根据需要进行展示。数据返回给前端:后端程序处理完业务逻辑后,将结果数据返回给前端。后端程序接收到请求后,根据请求的类型和参数进行相应的处理。

gp1052的博客 710

哎,这让人抠脑壳的 LFU

这是why哥的第 83 篇原创文章 让人抠脑壳的 LFU 前几天在某APP看到了这样的一个讨论: 看到一个有点意思的评论: LFU 是真的难,脑壳都给我抠疼了。 如果说 LRU 是 Easy 模式的话,那么把中间的字母从 R(Recently) 变成 F(Frequently),即 LFU ,那就是 hard 模式了。 你不认识 Frequently 没关系,毕竟这是一个英语专八的词汇,我这个英语八级半的选手教你: 所以 LFU 的全称是Least Frequently Used,最不经常使用策略。

qq_27243343的博客 362

LRU和LFU 算法(页面置换算法

LRU和LFU的区别 LRU和LFU都是内存管理的页面置换算法。 LRU:最近最少使用(最长时间)淘汰算法(Least Recently Used)。LRU是淘汰最长时间没有被使用的页面。 LFU:最不经常使用(最少次)淘汰算法(Least Frequently Used)。LFU淘汰一段时间内,使用次数最少的页面。 例子 假设LFU方法的时期T为10分钟,访问如下页面所花的时间正好为10分钟,内存块大小为3。若所需页面顺序依次如下: 2 1 2 1 2 3 4 ----------

热爱学习和钻研。 4万+

LFU算法

1,基本原理LFU(Least Frequently Used)算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。LFU的每个数据块都有一个引用计数,所有数据块按照引用计数排序,具有相同引用计数的数据块则按照时间排序。具体实现如下: 1. 新加入数据插入到队列尾部(因为引用计数为1);2. 队列中的数据被访问后,引用计数增加,队列重新排序;3...

Searcher_Recommeder的博客 1万+

缓存淘汰算法LFU

Windows-LFULFU的一个改进版,差别在于Window-LFU并不记录所有数据的访问历史,而只是记录过去一段时间内的访问历史,这就是Window的由来,基于这个原因,传统的LFU又被称为“Perfect-LFU”。LFU*数据缓存实现和LFU一样,不同的地方在于淘汰数据时,LFU*只淘汰引用计数为1的数据,且如果所有引用计数为1的数据大小之和都没有新加入的数据那么大,则不淘汰数据,新的数据也不缓存。相比LFU要低很多,不需要维护所有数据的历史访问记录,只需要维护引用次数为1的数据,也不需要排序。

m0_74282605的博客 761

LFU算法 初始频率 动态频率

LFU(Least Frequently Used)算法一种缓存淘汰策略,其核心思想是根据数据的访问频率来决定淘汰哪些数据。具体来说,LFU算法认为如果一个数据在过去一段时间内被访问次数很少,那么它在未来被再次访问的概率也很低。因此,当缓存空间不足时,LFU算法会选择访问频率最低的数据进行淘汰。在C++中实现LFU算法,通常需要以下几个步骤:数据结构设计:LFU算法通常需要一个哈希表和一个优先队列。哈希表用于存储每个元素的访问计数,键是元素的标识,值是元素的访问次数

sanqima的专栏 1049

LFU算法代码实现记录一下

开头 最后 参考 LFU算法详解

qq_41665452的博客 757

十三、Redis LFU算法详述(Least Frequently Used - 最不常用)

十三、Redis LFU算法详述(Least Frequently Used - 最不常用)

胖太乙 5857

基础知识四、Python实现LFU算法

在第一节中实现了双向链表DoubleLinkedList类,上一节中基于双向链表实现了LRU算法,本节课我们继续基于双向链表实现LFU(Least frequently used 最不经常使用)算法。 文章目录一、重写Node节点类二、LFU实现三、测试逻辑测试结果 一、重写Node节点类 构建LFUNode类 继承自第一节中的Node类,添加freq属性用来表示节点使用频率 class LFUN...

wang_xiaowang的博客 1890

python利用双向链表和map实现LFU算法

python利用双向链表和map实现LFU算法 双向链表链接: https://blog.csdn.net/weixin_41978134/article/details/106143560 """ @File : LFU.py @Author: wangjiahui @Date : 2020/5/17 17:02 @Desc : LRU算法 """ from Computer_Organization.node1 import DoubleLinkedList, No

Davecurry 311

缓存淘汰算法LRU和LFU

前言 LRU算法LFU算法是属于页面置换的一种算法,或者更通俗的说,就是缓存如何淘汰一种策略。 我们通常在设计一个系统的时候,由于数据库的读取速度远小于内存的读取速度,所以为了加快读取速度,会将一部分数据放到内存中,称为缓存。 但是内存容量是有限的,当你要缓存的数据超出容量,就得有部分数据删除,这时候哪些数据删除,哪些数据保留,就是LRU算法LFU算法要干的事。 什么是LRU算法 LRU算法,全称Least recently used,即最近最少使用。LRU算法的思想是如果数据最近被访问过,

Johnson_Marteest的博客 521

LRU和LFU算法

在redis的学习中,了解到了两种缓存清理算法,分别是LRU和LFU,在此针对这两种算法进行学习。

qq_43325216的博客 5119

LRU算法LFU算法

LRU算法LFU算法

冯同学的博客 3488

深入了解缓存算法:FIFO 、LFU 和 LRU 的原理及实现

选择合适的缓存算法可以显著提高系统性能。FIFO 算法简单易懂,但可能丢弃最近刚刚使用的数据;LFU 算法能够有效保留频繁使用的数据,但实现复杂;LRU 算法在处理时间局部性方面表现优异,且实现相对简单。根据具体需求选择合适的算法,可以帮助你更好地优化缓存系统。

m0_69432668的博客 2758

算法LFU及其优化

LFU算法及其优化

Zhangsama1的博客 3277

常用的数据结构以及常用的算法

常用的数据结构以及常用的算法 常用数据结构 数据结构是计算机存储、组织数据的方式。 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。 数据结构往往同高效的检索算法和索引技术有关。 一、线性表 线性结构: 最常用、最简单的一种数据结构。 线性表: 典型的线性结构。基本特点是线性表中的 数据元素有序且有限。结构中: ① 存在一个唯一的被称为“第一个”的数据元素; ② 存在一个唯一的被称为“最后一个”的数据元素; ③ 除第一个元素外,每

qq_47605698的博客 1330

沙滩垃圾自动清理车sw16可编辑.rar

沙滩垃圾自动清理车sw16可编辑.rar

上一篇: 记录一下 __gnu_cxx::hash_map传一个新allocator的写法
下一篇: 系统设计随笔
herm_lib
博客等级 码龄16年 173粉丝 115原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值