LRU算法介绍、优化、使用场景(Redis、MySQL、Memcached)

DBA面试题:MySQL缓存池LRU算法做了哪些改进? 下图是MySQL(MySQL5.7版本)体系架构图MySQL的InnoDb Buffer Pool 缓冲池是主内存中的一个区域,用来缓存InnoDB在访问表和索引时的数据。对于频繁使用的数据可以直接从内存中访问,从而加快处理速度。如果一台服务器专用作MySQL数据库使用时,通常将70%~80%(具体看总内存大小而定)的物理内存空间分配给缓冲池。缓冲池由多个缓冲池实例(innodb_buffer_p... 阅读详情
LRU算法是什么

LRU算法全称是最近最少使用算法(Least Recently Use),基本思想是基于局部性原理的时间局部性:

  • 如果一个信息正在被访问,那么在近期,它还有可能被访问
为什么要用LRU算法

LRU广泛被作用于缓存机制中,当缓存达到一定的上限后,需要从已有的数据中淘汰一部分数据,这种淘汰选择就是通过LRU算法完成的

基本的LRU算法

1、基于数组
实现: 为每一个缓存数据增加一个额外的属性 - 最近被访问时间戳,每当被访问后,都更新这个缓存数据的访问时间。当指定的数据空间已达到一定的阈值,遍历整个数组,淘汰时间戳最小的。
缺点: 维护额外的时间戳,耗费额外的空间;淘汰时,需要遍历整个数组。
2、基于有界双向链表。
实现: 访问数据时,数据不在链表中,则将数据插入链表头部,如果在链表中,则将数据移至链表头部。当数据空间满时,从队列尾部进行淘汰。
缺点: 查询、插入数据都需要遍历链表
3、基于双向链表和哈希表 (LinkedHashMap实现)
实现: 改进方案2,通过哈希表映射,将查询和插入的时间复杂度变成o(1)

LRU 算法优化(理论)
LRU-k

LRU-K算法有两个队列,一个是缓存队列,一个是数据访问历史队列。当访问一个数据时,首先先在访问历史队列中累加访问次数,当历史访问记录超过K次后,才将数据缓存至缓存队列,从而避免缓存队列被污染。同时访问历史队列中的数据可以按照LRU的规则进行淘汰
一般来讲,当K的值越大,则缓存的命中率越高,但是也会使得缓存难以被淘汰。综合来说,使用LRU-2的性能最优。
在这里插入图片描述
代码: //TODO

Two Queue

Two Queue可以说是LRU-2的一种变种,将数据访问历史改为FIFO队列。好处的明显的,FIFO更简易,耗用资源更少,但是相比LRU-2会降低缓存命中率。
在这里插入图片描述
代码: //TODO

Multi Queue

Multi Queue的实现则复杂的多,顾名思义,Multi Queue是由多个LRU队列组成的。每一个LRU队列都有一个相应的优先级,数据会根据访问次数计算出相应的优先级,并放在该队列中。
在这里插入图片描述

  • 数据插入和访问:当数据首次插入时,会放入到优先级最低的Q0队列。当再次访问时,根据LRU的规则,会移至队列头部。当根据访问次数计算的优先级提升后,会将该数据移至更高优先级的队列的头部,并删除原队列的该数据。同样的,当该数据的优先级降低时,会移至低优先级的队列中。

  • 数据淘汰:数据淘汰总是从最低优先级的队列的末尾数据进行,并将它加入到Q-history队列的头部。如果数据在Q-history数据中被访问,则重新计算该数据的优先级,并将它加入到相应优先级的队列中。否则就是按照LRU算法完全淘汰。

LRU使用场景
Memcached

Memcached 前面有文章已讲解过,思想与Multi Queue类似,详情看: Memcached内存管理模型与LRU算法优化

MySQL

MySQL change buffer缓存,使用的是类LRU-k的算法,读取新数据页页,不是放于LRU列表首部,而是放于5/8处,因为索引或数据扫描需要访问很多页,非活跃热点数据,放于首部,可能会移除真正的热点数据

Redis

Redis中的数据整体上是一个大的字典,Redis采用了基于采样的近似LRU算法,redis并没有去遍历所有对象,每个对象都记有最近访问时间戳。LRU算法也比较简单,Redis有一个全局的LRU时钟,每次随机取出5(maxmemory-samples默认参数)个redis对象,淘汰时间戳最小的。

深入探究LRU缓存机制:优化内存利用与提升性能 展望未来,随着数据规模的不断增大和计算机系统的不断发展,LRU缓存将继续发挥重要作用。我们期待着更多优秀的算法和技术在LRU缓存领域的应用,以进一步提升系统的性能和效率。最后,本文对LRU缓存的原理、应用和优化进行了总结,并希望读者能够从中获得启发和收获。通过本文的深入探讨,相信读者对LRU缓存有了更加全面和深入的了解。LRU缓存作为一种重要的缓存淘汰策略,不仅在理论上具有重要意义,而且在实际应用中也发挥着重要作用。 阅读详情

相关推荐

大厂面试必备:LRU算法-删除最近最未少使用算法(详细附源代码)

LRU算法 什么是LRU算法 LRU算法又叫删除最近最未使用算法,是一种缓存淘汰策略。 计算机中的容量是有限的,如果内存满了的话,那么就要删除旧的数据来满足让新数据可以填充进入,那么问题来了,什么样的数据就是要被删除的数据? LRU缓存算法是一种常用的策略。全名又称Least Recently Used,也就是说我们认为最近使用过的数据应该是是「有用的」,很久都没用过的数据应该是无用的,内存满了就优先删那些很久没用过的数据。 使用场景 比如说现在有一个鞋柜,里面可以存放6双鞋,每新买一双鞋,你都要将新鞋存

qq_41066066的博客 641

什么是LRU算法

什么是LRU算法

似水流年QC的博客 3万+

【今日面经】Java后端面经(主要问Mysql跟Redis)

内存是计算机硬件系统中的一个组成部分,它是CPU可以直接访问的数据存储区域,用于暂时存放运行中的程序和数据。内存是计算资源的重要一环,任何进程或程序都需要通过内存来执行和处理数据。:Redis是一个独立的、基于内存的数据存储系统,它可以被部署为一个服务或进程,为应用提供缓存功能。Redis缓存是位于应用层面上的一种软件解决方案,它利用内存作为数据的存储介质,目的是为了加速数据访问速度,减轻数据库负担。:内存的数据在计算机断电或重启后会丢失,除非有额外的机制如虚拟内存交换文件、数据库缓存等将数据写入磁盘。

Z70769691的博客 2195

面试被问道:LRU算法的优化手段(一)

LRU算法的优化手段(一),解决预读失效问题。

程序员阿药的博客 1268

AgentScope Java多智能体框架

AgentScope Java 的核心设计理念是“Agent-Oriented Programming” (面向智能体编程)。

zzz19920821的博客 1734

SAP ABAP干货:用REUSE_ALV_GRID_DISPLAY_LVC实现ALV多屏幕独立布局(含handle参数详解)

本文详细解析了SAP ABAP中如何使用REUSE_ALV_GRID_DISPLAY_LVC函数实现ALV多屏幕独立布局,重点介绍了handle参数的技术原理和实际应用。通过变式标识符和LTDX表存储机制,开发者可以确保不同ALV报表屏幕的布局设置互不干扰,提升复杂报表场景下的用户体验。

weixin_29268267的博客 309

使用Redis做MySQL的缓存

1 为什么使用缓存当网站的处理和访问量非常大的时候,我们的数据库的压力就变大了,数据库的连接池,数据库同时处理数据的能力就会受到很大的挑战,一旦数据库承受了其最大承受能力,网站的数据处理效率就会大打折扣。此时就要使用高并发处理、负载均衡和分布式数据库,而这些技术既花费人力,又花费资金。2 使用场景页面缓存经常用在CMS(content manage system)内存管理系统里面。 数据缓存经常会

Go for IT 5万+

【一起学UniGUI】--UniGUI的部署选项(5)

uniGUI支持Windows平台下所有主要部署选项。 1.Standalone Server (独立服务器) 最简单的部署方法是独立服务器。在这种模式下,应用程序服务器像桌面应用程序一样直接运行。它也是用于调试应用程序的模式。运行应用程序可执行文件后(它是一个EXE文件),它将最小化到托盘图标,并运行到用户手动终止为止。见下图: 一个独立的应用程序可以...

5776

Redis 为何使用Nearly LRU 算法淘汰数据

Redis的内存空间宝贵,维护LRU的双向链表需要使用比较多的额外空间,所以换了个实现

互联网架构师笔记 876

Auto.js凉了之后,我们该用啥?AutoX.js保姆级环境搭建与第一个脚本实战(2024最新)

本文详细介绍了AutoX.js作为Auto.js替代方案的环境搭建与脚本开发实战指南。从技术生态现状分析到2024最新环境配置,再到编写第一个实用脚本和进阶调试技巧,帮助开发者无缝迁移至AutoX.js平台。特别适合需要手机自动化的JavaScript开发者,涵盖从基础到企业级应用的全套解决方案。

weixin_28737073的博客 388

【Python】多分类算法—Random Forest

【Python】多分类算法—Random Forest 本文将主要就Random Forest(随机森林)的多分类应用进行描述,当然也可运用于二分类中 文章目录【Python】多分类算法—Random Forest前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 本文主要引用的是sklearn 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import nump

weixin_43166884的博客 1万+

Redis和MySQL的区别与使用(redis做mysql的缓存并且数据同步)

Redis基于内存,读写速度快,也可做持久化,但是内存空间有限,当数据量超过内存空间时,需扩充内存,但内存价格贵。MySQL基于磁盘,读写速度没有Redis快,但是不受空间容量限制,性价比高。大多数的应用场景是MySQL(主)+Redis(辅),MySQL做为主存储,Redis用于缓存,加快访问速度。需要高性能的地方使用Redis,不需要高性能的地方使用MySQL。存储数据在MySQL和Redis之间做同步。

web_15534206248的博客 2288

华为OD机试双机位C卷-MVP争夺战 (C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【MVP争夺战】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - MVP争夺战,

qq_45776114的博客 1170

Redis详细介绍

概述 什么是Redis Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。 Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。 与传统数据库不同的是 Redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Valu..

myStyle的博客 4048

23 中望CAD二次开发(ZRX C++)-自定义实体(二)

本文详细介绍了自定义图形实体,如何实现几何变换、捕捉、节点编辑,并介绍了CAD代理的概念。

cilvsuanna的博客 437

基于STM32F1XX 、HAL库的LTR-303ALS-01 环境光传感器驱动应用C语言程序设计

printf("制造商ID: 0x%02X\r\n", LTR303_ReadManufacID());printf("器件ID: 0x%02X\r\n", LTR303_ReadPartID());LTR-303ALS-01是一款数字环境光传感器(ALS),由Lite-On公司生产。printf("LTR-303ALS初始化失败!printf("LTR-303ALS初始化成功!printf("数据无效\r\n");* @param mode: 0-待机, 1-激活。

PP_Cottage的博客 1033

redis做mysql的缓存,怎么把redis数据和mysql数据同步?

一、为什么使用缓存? 当网站的处理和访问量非常大的时候,我们的数据库的压力就变大了,数据库的连接池,数据库同时处理数据的能力就会受到很大的挑战,一旦数据库承受了其最大承受能力,网站的数据处理效率就会大打折扣。此时就要使用高并发处理、负载均衡和分布式数据库,而这些技术既花费人力,又花费资金。 二、什么是redis缓存到mysql? Redis其实就是说把表中经常访问的记录放在了Re...

u011692780的博客 2万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Memcached和Redis

**Memcached:**是高性能分布式内存缓存服务器,本质是一个内存key-value 数据库,但不支持数据持久化,服务器关闭后,数据全部丢失。只支持 key-value结构。 Redis: Redis是一个key-value存储系统。将大部分数据放在内存中,支持的数据类型有:字符型、hash表、链表、集合、有序集合以及基于这些数据类型的相关操作。Redis内部使用一个redisobject对...

weixin_39940206的博客 173

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

redis和memcached的分析总结

Memcached和Redis的区别 Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等。 Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,sortset,hash等数据结构的存储。 虚拟内存: Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘 过期策略: m...

斛兵的博客 265

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Memcached和Redis数据缓存系统

1.1 Memcached介绍 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。 1.2 Memcached工作方式分析 许多Web应用都将数据保存到 RDBMS中,应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现

雪地里的白开水的博客 493

Redis数据库简介与选型场景

Redis是一个高性能的内存键值数据库,支持多种数据结构如字符串、哈希、列表、集合等。其主要特点包括内存存储带来的微秒级响应、丰富的数据结构支持以及持久化机制。Redis广泛应用于高性能缓存、实时排行榜、分布式锁、消息队列等场景,相比传统数据库可提供10倍以上的读写性能。典型应用包括电商商品页缓存、游戏积分榜、秒杀系统等。Redis通过单线程模型和高效数据结构设计,在速度、灵活性和可靠性之间取得平衡,成为现代架构中不可或缺的组件。

qq_39980997的博客 941

如何使用redis做mysql的缓存

应用Redis实现数据的读写,同时利用队列处理器定时将数据写入mysql。 同时要注意避免冲突,在redis启动时去mysql读取所有表键值存入redis中,往redis写数据时,对redis主键自增并进行读取,若mysql更新失败,则需要及时清除缓存及同步redis主键。   这样处理,主要是实时读写redis,而mysql数据则通过队列异步处理,缓解mysql压力,不过这种方

菜鸟的专栏 3万+

Redis,MemCached,MongoDB 概述

最近,一直在研究服务器性能优化和高并发请求访问,调研了非结构化数据(NoSQL)和内存加速(Cache),对老平台服务进行重新架构设计,力求节约成本10000美金/每月。调研项目主要有Redis、 MemCached、 MongoDB,以及Amazon的DynamoDBRedis 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言

阳光岛主 7346

Redis简单介绍

1、什么是Redis?简述它的优缺点? Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。 因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。 Redis的出色之处不仅仅是性能,Redis最大的魅力是支...

qq_37191690的博客 419
上一篇: java 线程池核心配置与介绍
下一篇: 秒杀系统总结与思考(四) 流量削峰
Kindle_code
博客等级 码龄12年 21粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值