LRU(1)
LRU是"Least Recently Used
"(最近最少使用)的缩写,它是一种常用的页面置换算法和缓存淘汰策略。当计算机系统的内存或缓存资源有限时,LRU算法根据的历史访问记录来决定哪些数据应该被保留在内存或缓存中,哪些被淘汰。其核心思想是“如果一个数据项在最近一段时间内没有被访问过,那再未来的一段时间内它被访问的可能型也比较小”。因此,当需要腾出空间给新的数据项时,LRU会选择哪些最长时间未被使用的数据项目进行淘汰。
页面访问序列 | 2 | 3 | 2 | 1 | 5 | 2 | 4 | 5 | 3 |
---|---|---|---|---|---|---|---|---|---|
第1块 | 2/1 | 2/1 | 2/2 | 2/2 | 2/0 | 2/2 | 2/0 | 2/0 | 3/1 |
第2块 | 3/1 | 3/1 | 3/1 | 5/1 | 5/1 | 5/0 | 5/1 | 5/0 | |
第3块 | 1/1 | 1/0 | 1/0 | 4/1 | 4/1 | 4/0 | |||
缺页否(*) | * | * | * | * | * | * | |||
换出页面 | 3,1 | 1 | 2 | ||||||
随机 | |||||||||
换进页面 | 2 | 3 | 1 | 5 | 4 | 3 |
LRU工作原理
LRU可以通过多种方式来跟踪数据项的使用情况:
-
基于栈的方式:可以利用一个特殊的栈来保存当前正在使用的各个页面的页面号。每当进程访问某页面时,便将该页面号压入栈顶,其他的页面号往栈底移。这样,栈顶始终时最新被访问的页面编号,而栈底则时最近最久未访问的页面编号。
-
双向链表与哈希表结合:为了确保
get
和put
方法的时间复杂度为O(1),通常采用双向链表加哈希表的数据结构。哈希表用于快速查找是否再缓存中,而双向链表则用来维护元素的顺序,保证新插入或最近访问过的袁术位于链表头部,而最久未使用的袁术位于链表尾部。 -
数据访问记录:LRU 算法会为每个缓存的数据块维护一个访问时间戳或者访问顺序记录。每当一个数据块被访问(读或写操作)时,它的时间戳就会更新,或者它在访问顺序记录中的位置就会调整到最新(例如,移到队列的头部)。
-
缓存空间已满时的处理:
-
当缓存空间已满,需要放入新的数据块时,LRU 算法会查找访问时间最早或者最久未被访问的数据块。
-
例如,假设有一个缓存大小为 3 的数据缓存,里面已经存放了数据块 A、B、C。此时,如果要访问数据块 D,由于缓存已满,LRU 算法会检查 A、B、C 这三个数据块的访问顺序。假设 A 是最早被访问的(也就是最近最少使用的),那么 A 就会被从缓存中移除,D 则会被放入缓存,并且 D 会被标记为最新访问的数据块。
-
-
使用数据结构实现:
-
一种常见的实现方式是使用链表和哈希表结合。链表用于维护数据块的访问顺序,新访问的数据块会被移到链表头部。哈希表用于快速查找数据块在链表中的位置,这样可以在 O (1) 时间复杂度内完成数据的访问和更新操作。
-
比如,在一个简单的 LRU 缓存实现中,每次访问一个数据块,通过哈希表可以快速定位到链表中的节点,然后将该节点从原来的位置移除并插入到链表头部,以此来更新访问顺序。如果缓存已满,需要淘汰数据块时,直接删除链表尾部的数据块即可,因为链表尾部的数据块就是最近最少使用的数据块。
-
LRU 的应用场景
LRU 在计算机系统的缓存管理中应用广泛,如 CPU 缓存、数据库缓存等。在 Web 服务器的内容缓存中也经常使用,它可以帮助服务器快速响应客户端的请求。例如,当用户频繁访问某些网页时,这些网页的数据就会被保留在缓存中,而那些长时间无人访问的网页数据可能会被淘汰,从而提高缓存的命中率和系统的整体性能。
LRU优势:
LRU 算法能够很好地适应访问模式的变化。如果数据的访问频率发生改变,它会自动调整缓存中的数据,使得经常被访问的数据能够留在缓存中。并且它的实现相对简单,与其他一些复杂的缓存淘汰策略相比,它的时间复杂度和空间复杂度在很多情况下都比较容易控制,能够在性能和资源利用之间取得较好的平衡。
缓存系统
数据库查询缓存:
-
在企业级应用中,数据库查询操作通常是比较耗时的。例如,在一个电商系统中,商品信息的查询很频繁。通过使用 LRU 缓存,可以将最近查询的商品信息存储在内存中。当有新的查询请求时,首先在缓存中查找。如果缓存命中,就直接返回结果,避免了重复的数据库查询。
-
假设缓存大小为 100 条商品信息记录。当查询商品 A 时,LRU 算法会将商品 A 的信息缓存起来。如果缓存已满,并且又要缓存新的商品信息,它会根据 LRU 策略,淘汰最久未被查询的商品信息。这样可以大大提高系统的响应速度,减少数据库的负载。
Web 服务器内容缓存:
-
在 Web 服务器中,对于经常访问的网页内容,如 HTML 文件、图片、脚本等可以进行缓存。以一个新闻网站为例,热门新闻页面会被大量用户访问。服务器可以使用 LRU 缓存来存储这些热门页面的内容。
-
比如,一个 Web 服务器的缓存可以存储 1000 个网页内容。当用户请求一个网页时,服务器先检查 LRU 缓存。如果页面在缓存中,就直接返回缓存中的内容,提高了网页的加载速度。当缓存满了,LRU 算法会淘汰那些访问次数最少的网页内容,保证缓存中总是存储最有可能被访问的内容。
内存管理
Java 虚拟机(JVM)中的对象缓存:
-
在 JVM 内部,对于一些频繁创建和销毁的对象,可以使用 LRU 缓存来管理。例如,在一个图形处理应用中,会频繁创建和使用一些图形对象,像形状、颜色等对象。
-
假设 JVM 中有一个小型的对象缓存,大小为 50 个对象。这些图形对象可以被缓存起来。当需要再次使用某个图形对象时,首先在缓存中查找。如果缓存中有,就直接使用,避免了重新创建对象的开销。LRU 算法会确保缓存中的对象是最近最有可能被使用的,当缓存满时,会淘汰最久未被使用的对象。
分布式系统中的缓存
分布式缓存集群(如 Redis):
-
在分布式系统中,多个节点可能会共享一个缓存集群。LRU 策略可以用于管理这些缓存节点中的数据。例如,在一个电商系统的分布式缓存中,不同的服务器节点可能会访问和缓存用户的购物车信息。
-
假设分布式缓存集群中有 10 个节点,每个节点都有自己的 LRU 缓存。当某个节点需要存储新的购物车信息,但缓存已满时,LRU 算法会在该节点的缓存中淘汰最久未被访问的购物车信息,从而保证缓存的高效利用,提高整个分布式系统的性能。这种应用场景可以有效避免缓存数据的不一致性和过期问题,使得分布式缓存能够更好地服务于多个节点的应用需求。
LRU局限性
Java中使用链表实现的LRU(Least Recently Used)缓存虽然在很多情况下能够有效地提高系统性能,但也存在一些局限性。这些局限性主要体现在内存占用、并发处理能力以及面对特定访问模式时的表现上。
内存占用
首先,基于链表和哈希表的数据结构实现LRU缓存需要额外的空间来存储指针信息。对于每个缓存项而言,不仅需要保存实际的数据内容,还需要维护前驱和后继节点的引用。当缓存容量较大时,这种额外的开销可能会变得显著,导致整体内存消耗增加。此外,频繁地进行插入和删除操作会导致内存分配和释放活动增多,进而可能引起内存碎片化问题。
并发性能
其次,在高并发场景下,链表操作可能会成为性能瓶颈。由于双向链表不是线程安全的,默认情况下多个线程同时访问或修改同一个LRU缓存实例时,必须采取适当的同步措施以确保数据一致性。然而,全局加锁的方式虽然简单直接,但在多线程环境下容易造成争用热点,影响吞吐量。因此,如果应用对并发度要求较高,则需要考虑更复杂的同步策略或者采用其他更适合并发环境的数据结构。
对特定访问模式的支持
最后,传统的LRU算法仅考虑了最近最少使用的特性,而忽略了某些数据可能被频繁访问的事实。这意味着一旦出现周期性的批量读取请求或者其他非典型的访问模式,LRU缓存有可能会因为“缓存污染”而导致命中率下降。例如,当发生偶发性的大量历史数据查询时,原本应该保留下来的热门数据可能会被新进来的冷门数据所替代,从而降低了缓存的有效性。
为了解决上述问题,业界提出了多种改进方案:
-
LRU-K:通过记录每个缓存项最近K次访问的时间戳,选择淘汰第K次访问时间最久远的那个元素。这种方法可以在一定程度上缓解短期突发流量对缓存的影响。
-
2Q (Two Queues):该算法将缓存分为两个队列,分别存放短期访问频率较低与长期访问频率较高的项目。当某个项目从一个队列迁移到另一个队列时,表明它可能是经常使用的对象,有助于提升缓存命中率。
-
ARC (Adaptive Replacement Cache):这是一种自适应替换策略,通过动态调整两个LRU列表(T1 和 T2)及相应的历史列表(B1 和 B2),使得算法能够在不同类型的访问模式下都表现出色。
相关文章:
LRU(1)
LRU是"Least Recently Used"(最近最少使用)的缩写,它是一种常用的页面置换算法和缓存淘汰策略。当计算机系统的内存或缓存资源有限时,LRU算法根据的历史访问记录来决定哪些数据应该被保留在内存或缓存中,哪些被淘汰。其核心思想是“…...

VSCode 使用鼠标滚轮控制字体
一、 文件 | 首选项 | 设置 二、单击在 settings.json中编辑 "editor.mouseWheelZoom": true 注注注意:保存哦!ctrlS 三、测试 按住ctrl鼠标滚轮,控制字体大小...

数据库(3)--针对列的CRUD操作
1.Create 新增 语法: insert into 表名 (列名)values (列)... 创建一个学生表用于演示: create table if not exists student( id bigint comment 编号, name varchar(20) comment 姓名 ); 1.1直接增加…...

【Linux】记录一下考RHCE的学习过程(七)
年底了,公司接的北京地铁轨道交通的项目做不完了,一百多列地铁的设备都得调,派我出差了几周,这几天才回来,出差累死了实在是没办法更新。(YOASOBI的二开票还没抢到ToT,哭死,看看回滚…...

【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 1:背景动机
目录 1 简单概括2 几个重要发现3 主要贡献4 背景知识5 方法简介 论文:Multi-Head Encoding for Extreme Label Classification 作者:Daojun Liang, Haixia Zhang, Dongfeng Yuan and Minggao Zhang 单位:山东大学 代码:https://gi…...

使用hardhat进行合约测试
演示源码:hardhat-demo: 演示基于hardhat的HelloWord合约测试案例。 环境 NodeJs 创建工程 1.创建一个hardhat工程根目录(hardhat-demo),然后进入该目录执行。 npx hardhat执行该命令,会进行hardhat工程初始化。 提示我们是否安装该版本h…...
基于生成式对抗网络(GAN)的前沿研究与应用
引言 人工智能(AI)领域在过去几年中经历了快速的发展,尤其是深度学习的兴起带来了许多变革。其中,生成式对抗网络(Generative Adversarial Network, GAN)因其强大的生成能力成为了研究热点。自2014年Ian G…...
Apache zookeeper集群搭建
文章目录 引言I 集群搭建保证服务器基础环境一致JDK安装与配置环境变量安装与修改zk配置文件同步zk安装包与配置文件zk集群启停查看进程、状态、日志II 扩展:shell脚本一键启停引言 springCloud 脚手架项目功能模块:Java分布式锁 https://blog.csdn.net/z929118967/article/d…...
cmake使用记录
Android相关 编译一个动态库,到指定的目录 cmake_minimum_required(VERSION 3.22.1) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../v2x_algo_output/${ANDROID_ABI}) project("serial_port") include_directories(include) add_…...

nginx http反向代理
系统:Ubuntu_24.0.4 1、安装nginx sudo apt-get update sudo apt-get install nginx sudo systemctl start nginx 2、配置nginx.conf文件 /etc/nginx/nginx.conf,但可以在 /etc/nginx/sites-available/ 目录下创建一个新的配置文件,并在…...

实数的奥秘:柯西序列深度解析
实数的奥秘:柯西序列深度解析 一、柯西序列的概念与性质二、柯西序列定义无理数三、柯西序列定义实数系统 实数,是初中学到的概念,我知都知道它是有理数和无理数的统称。 然而,实数可不只是小数点后的一堆零碎儿,它背后…...
信息系统管理师试题-人力资源
信息系统管理师试题-人力资源 当组织计划的人力资源需求超过供给时,可通过下列方法解决,其中不包括() A降低录用标准,招聘新员工 B增加临时性员工和使用退休员工 C减少加班数量或工作时间 D提高员工工作效率 答案C 下…...

补偿电阻对ota零极点的影响
本文内容主要是关于补偿电阻对零极点产生的影响。 1.极点分析 该补偿电阻并不会影响在输出端的主极点,受影响的主要是镜像极点。 这里我们可以先单看电流镜部分,这个补偿电阻的作用在于将极点推向原来的两倍,从而达到增加带宽的目的[1]。 …...

UVM: uvm_sequence
topcic sequence overview sequence excution flow sequence class callbacks sequencer driver communication...

编译技术实验三之编译器的构造和设计
一、实验目的: 我们将设计多个不同的综合实验项目提供给学生选择。(如:LL(1)文法自动生成语法分析程序的设计;单词的自动识别与智能纠错;语言的程序编辑器;数学计算式的识别等)学生可在这些项目中选择1个项…...

数据挖掘——数据预处理
数据挖掘——数据预处理 数据预处理数据预处理 ——主要任务数据清洗如何处理丢失的数据如何处理噪声数据如何处理不一致数据 数据集成相关分析相关系数(也成为皮尔逊相关系数)协方差 数据规约降维法:PCA主成分分析降数据——抽样法数据压缩 数据预处理 数据预处理…...

ECharts饼图下钻
背景:项目上需要对Echarts饼图进行功能定制,实现点击颜色块,下钻显示下一层级占比说明:饼图实现点击下钻/面包屑返回的功能 数据结构 [{name: a,value: 1,children: [...]},... ]点击下钻 // 为图表绑定点击事件(需要…...

【RK3568笔记】Android修改开机动画
概述 Android 的开机动画是由一系列连续的 PNG 图片作为帧组成的动画形式,不是一张 GIF 图片。将各帧 PNG 图片以压缩方式进行保存(压缩方式要求是存储压缩),并将保存的文件名命名为 bootanimation.zip,这个 bootanim…...

嵌入式技术之Linux(Ubuntu) 一
一、Linux入门 1.硬件和操作系统以及用户的关系 一个传感器,获得数据后,需要向服务器发送数据。传感器传数据给上位机。 上位机需要一个程序来接收数据,那么这个上位机是什么机器? 我们的笔记本电脑就可以当成上位机。 两个手…...
代码随想录day39 动态规划7
打家劫舍 题目:198.打家劫舍 213.打家劫舍II 337.打家劫舍III 需要重做:全部 198.打家劫舍 思路:第i个房子偷与不偷,取决于第i-2个房子和第i-1个房子 注意:注意下标的一致性。现在的下标含义是房子的下标&#x…...

git查看commit属于那个tag
1. 快速确认commit原始分支及合入tag # git describe 213b4b3bbef2771f7a1b8166f6e6989442ca67c8 查看commit合入tag # git describe 213b4b3bbef2771f7a1b8166f6e6989442ca67c8 --all 查看commit原始分支 2.查看分支与master关系 # git show --all 0.5.67_0006 --stat 以缩…...
MySQL 使用全局锁会导致的问题?
MySQL 使用全局锁会导致以下核心问题: 业务停摆与主从延迟 主库备份:备份期间所有更新操作被阻塞,业务系统陷入等待状态从库备份:无法执行主库同步的 binlog,导致主从复制延迟加剧 并发性能急剧下降 …...
【加密算法】
计算机网络加密算法详解 在计算机网络中,加密算法是保障数据安全的核心技术,用于防止数据在传输过程中被窃听、篡改或伪造。本文将详细介绍常见的加密算法分类、工作原理及其在网络中的应用。 1. 加密算法分类 加密算法主要分为以下三类: 类型特点典型算法对称加密加密和解…...

【笔记】2025 年 Windows 系统下 abu 量化交易库部署与适配指南
#工作记录 前言 在量化交易的学习探索中,偶然接触到 2017 年开源的 abu 量化交易库,其代码结构和思路对新手理解量化回测、指标分析等基础逻辑有一定参考价值。然而,当尝试在 2025 年的开发环境中部署这个久未更新的项目时,遇到…...

ChatGPT Plus/Pro 订阅教程(支持支付宝)
订阅 ChatGPT Plus GPT-4 最简单,成功率最高的方案 1. 登录 chat.openai.com 依次点击 Login ,输入邮箱和密码 2. 点击升级 Upgrade 登录自己的 OpenAI 帐户后,点击左下角的 Upgrade to Plus,在弹窗中选择 Upgrade plan。 如果…...

Redisson学习专栏(一):快速入门及核心API实践
文章目录 前言一、Redisson简介1.1 什么是Redisson?1.2 解决了什么问题? 二、快速入门2.1 环境准备 2.2 基础配置三、核心API解析3.1 分布式锁(RLock)3.2 分布式集合3.2.1 RMap(分布式Map)3.2.2 RList&…...

数字孪生技术赋能西门子安贝格工厂:全球智能制造标杆的数字化重构实践
在工业4.0浪潮席卷全球制造业的当下,西门子安贝格电子制造工厂(Electronic Works Amberg, EWA)凭借数字孪生技术的深度应用,构建起全球制造业数字化转型的典范。这座位于德国巴伐利亚州的“未来工厂”,通过虚实融合的数…...
青少年编程与数学 02-020 C#程序设计基础 11课题、可视化编程
青少年编程与数学 02-020 C#程序设计基础 11课题、可视化编程 一、可视化编程1. 降低学习门槛2. 提高学习兴趣3. 便于学习和掌握4. 为后续学习打下基础5. 适合不同年龄段和背景的初学者6. 适合初学者的可视化编程工具 二、可视化编程适合初学者1. 降低学习门槛2. 提高学习兴趣3…...
前后端传输 Long 类型数据时(时间戳,雪花算法ID),精度丢失的根本原因
前后端传输 Long 类型数据时,精度丢失的根本原因是 JavaScript 的 Number 类型无法精确表示超过 53 位(64 位双精度浮点数)的整数,而 Java 的 Long 类型是 64 位整数。当后端返回的 Long 值超过 2^53-1(即 90071992547…...

使用 OpenCV 实现哈哈镜效果
在计算机视觉和图像处理领域,OpenCV 提供了非常强大的图像几何变换能力,不仅可以用于纠正图像,还能制造各种“有趣”的视觉效果。今天,我们就来实现一个经典的“哈哈镜”效果,让图像像在游乐园里一样被拉伸、压缩、扭曲…...