当前位置: 首页 > news >正文

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

上一次,相信大家已经知道关于 LRU 页面置换算法的思想和实现了,这里可以一键直达:

  • 【LRU】一文让你弄清 Redis LRU 页面置换算法

Redis 的淘汰策略中,关于 LFU 页面置换算法,今天咱们来捋一捋到底思想是啥,可以如何去实现它

这就让我们进入状态吧

✔LFU 的思想和实现

LFU 全称为:Least frequently used

含义为:使用频次最少的,即为 最不经常使用的

思想是:如果数据在一段时间被访问的次数较少,那么在未来的一段时间,这段数据被访问的几率就会更小

可以看到 LRU 和 LFU 思想上的区别是非常明显的

  • LRU 强调最近最少使用,关注的是最近有没有使用过
  • LFU 强调的是一段时间的使用次数,关注的是频次

实际上, LRU 和 LFU 在实现上也是挺相似的,都要使用到双向链表和 hashmap,只不过,我们需要思考如何很好的处理好频次这个数据

LRU 查询数据的时候,为了将时间复杂度从 O(n) 降低到 O(1),选择了使用 hashmap 来存放具体的 key 和对应的 数据节点

那么 LFU 中,也可以如法炮制,可以使用 hashmap 存放 频次 和 对应的该频次的节点组成的链表

👀👀简单来看

  • LRU 的实现时用一个双向链表,插入数据使用头插法,从尾部淘汰数据
  • 那么 LFU 的实现实际上是使用了 2 个 hashmap 和 多个 双向链表,插入数据使用尾插法,淘汰数据从链表头淘汰

✔举例时刻

还是同样的方法,咱们举个例子,就能很好的明白这个思想了

例如,我们还是要插入这些数据

set(0,0),set(1,1),set(2,2),set(3,3),set(4,4),get(3) ,set(5,5) ,链表的容量为 3

来模拟一下 LFU 的处理过程😁

同理,

先插入前面 3 个节点数据

0, 1, 2,此处 LFU 是使用的尾插法,此处对于首次插入的数据,频次都是 1 ,因此会默认放到频次为 1 的对应的链表上

插入 3,

由于 LFU 容量为 3 ,已经满了,当前发生了缺页,需要置换数据

淘汰 频次(最低的)为 1 的链表的头结点,且删除 hashmap 中的数据,同时将 3 这个节点的数据加入到 hashmap 中

插入 4,

由于 LFU 容量为 3 ,已经满了,当前发生了缺页,需要置换数据

淘汰 频次(最低的)为 1 的链表的头结点,且删除 hashmap 中的数据,同时将 4 这个节点的数据加入到 hashmap 中

获取 3,

key 为 3 的节点在 LFU 中,更新 3 节点的频次,从频次 1 更新到 频次 2

相当于在频次为 1 对应得的链表中,删除 3 这个节点,让 2 节点和 4 节点进行相连,再将 3 这个节点加入到频次为 2 的链表中,同时更新 hashmap 中 key 为 3 的值

插入 5,

由于 LFU 容量为 3 ,已经满了,当前发生了缺页,需要置换数据

淘汰 频次(最低的)当前频次为 1 的链表的头结点,且删除 hashmap 中的数据,同时将 5 这个节点的数据加入到 hashmap 中

从上述演示中,我们可以看到关于 LRU 的关键逻辑

  1. 实现基本的链表,使用一个 hashmap 来存放 key 和对应的节点使用另外一个 hashmap 来存放频次和其对应的链表
  1. 插入的数据时,如果 LFU 容量已满,那么找到频次最低的那条链表,删除链表头,并插入数据到链表尾部
  1. 查询数据的时候,若数据已经存在于链表中,则将该节点的频次 +1,且放到对应频次的链表尾部

那么在实现的时候,只需要实现基本的链表以及关于两个 hashmap 的联动即可实现我们的 LFU

LFU 相对 LRU 的实现来说,会多维护一个 hashmap ,只不过这个 hashmap 是 key 为 频次,value 为链表 ,即上图中的 hashmap_freq

知道 LFU 的思想,以及 LFU 中数据变动的过程明白了,写代码都是很简单的事情,感兴趣的 xdm 可以查看我的 code 地址:https://github.com/qingconglaixueit/my_lru_lfu/blob/main/my_lfu/lfu.go

代码案例结果

仓库地址中 main.go 代码实现和 LRU 的一致,只不过,咱们的句柄和具体实现换成了 LFU 的

代码运行效果如下:

总结

至此,咱们将 Redis 淘汰策略中的 LRU 和 LFU 页面置换算法的思想,演示,以及具体实现都聊了一下,如果有偏差, 还请提出,兄弟们不吝赐教哦

感兴趣的,随时可以下载源码,在你的机器上运行哦,仓库地址如下:

https://github.com/qingconglaixueit/my_lru_lfu

感谢阅读,欢迎交流,点个赞,关注一波 再走吧

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

文中提到的技术点,感兴趣的可以查看这些文章:

  • 【LRU】一文让你弄清 Redis LRU 页面置换算法
  • 什么是单点登录?什么又是 OAuth2.0?
  • 什么是分布式锁?他解决了什么样的问题?
  • 【Redis 系列】redis 存储结构原理 1
  • 【Redis 系列】redis 存储结构原理 2
  • 我是如何用 redis 分布式锁来解决线上历史业务问题的

可以进入地址进行体验和学习:https://xxetb.xet.tech/s/3lucCI

相关文章:

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

上一次,相信大家已经知道关于 LRU 页面置换算法的思想和实现了,这里可以一键直达: 【LRU】一文让你弄清 Redis LRU 页面置换算法 Redis 的淘汰策略中,关于 LFU 页面置换算法,今天咱们来捋一捋到底思想是啥&#xff0…...

Python爬虫实战:用简单四步爬取小红书图片

小红书是一个热门的社交分享平台,汇聚了大量精美的图片。如果您希望保存或使用这些图片,本文将为您详细介绍如何使用Python爬虫轻松爬取小红书图片。 一、安装必要的库 在开始之前,确保您已经安装了以下Python库: requests&#…...

行为型模式-解释器模式

提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 意图:给定一个语言,定义它的文法表示,并定义一个解释…...

Linux系统编程(五):信号

参考引用 UNIX 环境高级编程 (第3版)黑马程序员-Linux 系统编程 1. 信号基础理论 1.1 概念和机制 概念 信号在生活中随处可见,如:古代战争中摔杯为号、现代战争中的信号弹、体育比赛中使用的信号枪他们都有共性:简单、不能携带大量信息、满足…...

学习路之工具--SecureCRT的下载、安装

百度盘: 链接: https://pan.baidu.com/s/1r3HjEj053cKys54DTqLM4A?pwdgcac 提取码: gcac 复制这段内容后打开百度网盘手机App,操作更方便哦 感谢大佬 简单介绍下SecureCRT SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序&a…...

软件定义网络-OpenvSwitch

软件定义网络(SDN)。它主要有以下三个特点: 控制与转发分离:转发平面就是一个个虚拟或者物理的网络设备,就像小区里面的一条条路。控制平面就是统一的控制中心,就像小区物业的监控室。它们原来是一起的&…...

Android Update Engine 分析(二十三)如何在升级后清除用户数据?

文章目录 0. 导读1. 擦除用户数据流程1.1 制作升级包阶段1. 制作升级包的 "--wipe-user-data" 选项2. 什么是 POWERWASH?1.2 OTA 升级阶段1. payload_properties.txt 文件中的 "POWERWASH=1"2. ApplyPayload 函数设置 InstallPlan3. PostinstallRunnerAct…...

分享从零开始学习网络设备配置--任务3.7 使用动态路由RIPv2实现网络连通

任务描述 某公司随着规模的不断扩大,路由器的数量开始有所增加。网络管理员发现原有的静态路由已经不适合现在的公司,实施动态路由RIPv2协议配置,实现网络中所有主机之间互相通信。 在路由器较多的网络环境中,手工配置静态路由…...

游戏录屏软件推荐,教你录制高清游戏视频

“有没有好用的游戏录屏软件推荐呀,最近当上了游戏主播,平台要求每天都要发一个游戏视频,可是我的游戏录屏软件太拉胯了,录制出来的视频非常糊,导致平台审核不通过,所以想问问大家有没有游戏录屏软件推荐一…...

四川眼科医院孙丰源教授团队为患者拔除1.4cm长“眼中钉”

在户外劳作进行一些危险性的操作时,如果不注意防护,就很容易造成一些意外事件发生。广元的张先生使用割草机除草时,被割草机断裂的锯片击伤了左眼,伤势严重,所幸在孙丰源教授团队的帮助下,及时获得了治疗&a…...

PHP 初学 GO 学习笔记

说要学GO,但是总是三天打鱼,两天晒网的,既然如此就记录到博客上,这样既能督促自己,也能随时查看自己学习的进度。 [2023-09-20] Go 语言最少有个 main() 函数。 iota : 特殊常量,可理解为 const 语句块中的行索引 …...

前端制作

使用float: left将格子左浮动。 设置格子背景颜色&#xff0c;字体颜色&#xff0c;鼠标放上去后的字体颜色和背景颜色 <style>.title {width: 100%;overflow: hidden;}.title-topic a { /*以下元素应用于topic*/float: left; /*左浮动&#xff0c;让12个格子在…...

扩散模型:DDPM代码的学习(基于minist数据集)

文章目录 序言一参考资料①代码来源②相关概念理解③公式推导及训练流程讲解④搜索问题的网站⑤模型运行的环境 二代码解读①模型②训练③测试 三主要训练过程的解析 序言 本文主要对一个基于minist数据集搭建的DDPM模型代码中各个模块的含义进行解析&#xff0c;初步记录了自…...

小程序-uniapp:URL Link / 适用于在移动端 从短信、邮件、微信外网页 等场景打开小程序任意页面

一、背景介绍 小程序URL Scheme、URL Link是微信小程序后台生成的一种地址&#xff0c;适用于从短信、邮件、微信外网页 等场景打开小程序任意页面。所以&#xff0c;适用性极强。可与微信扫码携带参数跳转到小程序指定页面技术互补 若在微信外打开&#xff0c;用户可以在浏览…...

干货 | 基于在线监控数据的非现场监管问题识别模型研究

以下内容整理自2023年夏季学期大数据能力提升项目《大数据实践课》同学们所做的期末答辩汇报。 我们汇报的题目是基于在线监控数据的非现场监管问题识别模型研究&#xff0c;我们的汇报将从五个部分展开。首先是项目背景说明&#xff0c;该项目是为了遏制企业逃避监管行为的发生…...

Spring Cloud Alibaba Gateway 简单使用

文章目录 Spring Cloud Alibaba Gateway1.Gateway简介2. 流量网关和服务网关的区别3. Spring Cloud Gateway 网关的搭建3.1 Spring Cloud Gateway 配置项的说明3.2 依赖导入3.3 配置文件 Spring Cloud Alibaba Gateway 1.Gateway简介 Spring Cloud Gateway是一个基于Spring F…...

两种fifo实现方式的差异

减少数据通路翻转来降低功耗: 以FIFO (当容量较小而使用寄存器作为存储部分)设计为例,虽然理论上可以使用比较简单的数据表项逐次移位的方式,实现FIFO 的先入先出功能,但是却应该使用维护读写指针的方式(数据表项寄存器则不用移位)实现先入先出的功能。因为数据表项逐次…...

孜然单授权系统V1.0[免费使用]

您还在为授权系统用哪家而发愁&#xff1f;孜然单授权系统为您解决苦恼&#xff0c;本系统永久免费。 是的&#xff0c;还是那个孜然&#xff0c;消失了一年不是跑路了是没有空&#xff0c;但是这些都是无关紧要的&#xff0c;为大家带来的孜然单授权系统至上我最高的诚意&…...

kubernetes问题(一)-异常事件

1 pod状态处于Evicted 0/1 现象&#xff1a; 1&#xff09;kubectl get events发现“failed to garbage collect required amount of images”。 2&#xff09;同时磁盘空间不足的节点有大量pod处于Evicted 0/1状态&#xff0c;但并未进行重新调度。 原因描述&#xff1a; …...

Android Jetpack组件架构 :LiveData的使用和原理

Android Jetpack组件架构&#xff1a; LiveDate的使用和原理 导言 继Lifecycle组件之后我们接下来要介绍的就是LiveDate组件&#xff0c;所谓LiveDate字面意思上就是有声明的数据&#xff0c;当数据有改动时该组件可以感知到这个操作并将该事件通知到其观察者&#xff0c;这样…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...