Redis LRU

article/2025/9/29 17:41:43

一:Redis内存驱逐的几种策略

检测易失数据(可能会过期的数据集server.db[i].expires )

① volatile-lru:挑选最近最少使用的数据淘汰

② volatile-lfu:挑选最近使用次数最少的数据淘汰

③ volatile-ttl:挑选将要过期的数据淘汰

④ volatile-random:任意选择数据淘汰

检测全库数据(所有数据集server.db[i].dict )

⑤ allkeys-lru:挑选最近最少使用的数据淘汰

⑥ allkeys-lfu:挑选最近使用次数最少的数据淘汰

⑦ allkeys-random:任意选择数据淘汰

放弃数据驱逐

⑧ no-enviction(驱逐):禁止驱逐数据( redis4.0中默认策略),会引发错误OOM( Out Of Memory)

二:传统的LRU算法

采用map+双向链表实现。

LRU 算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。

 

传统的lru算法是强制移除头部元素,头部元素表示最早插入并且最长时间没有使用,数据之间有严格的边界,数据分布如下图:

绿色:新加入的数据

深灰色:未删除的数据

浅灰色:已经删除的数据

  • 图 1

三:Redis中的LRU

首先redis并没有使用传统的lru算法进行内存驱逐,是因为传统的lru算法需要额外的双向链表,链表本身需要记录key,还要有前指针和后指针,链表中的引用和指针和key占据的内存在链表长度过大的时候是非常恐怖的(链表的数据空间的占据甚至有可能超过数据本身!),并且这个链表如果应用在redis,可是redis服务全局的链表,链表长度可想而知,redis是基于内存的数据库,内存是宝贵的资源,为了尽可能的降低内存的使用,作者在redis实现中自己去实现了lru算法,舍弃掉了传统lru中的双向链表,但是这个lru并不是很严格,是有可能移除新插入的数据的,redis不同版本中的lru算法实现逻辑还不一样,我们分版本去讲解。

1) Redis 2.8版本中的LRU

简单说一下2.8版本中的lru实现

redis有一个24位的全局时钟,该全局时钟每一段时间会更新,每次在redis中存储/使用数据都会更新redis服务器的当前时钟至该数据,当需要内存驱逐的时候,获得当前服务器的时钟,随机抽取maxmemory-samples设置的n条数据,然后从中找到一个距离当前服务器时间戳差距最大的key,就是需要淘汰的key

图2中 5 samples为参数设置maxmemory-samples:5,刚插入的数据有可能被删除掉,所以,作者在3.0版本中又对lru做了些优化。

绿色:新加入的数据

深灰色:未删除的数据

浅灰色:已经删除的数据

2) Redis 3.0版本中的LRU

3.0版本内部维护了一个pool(大小为16),pool中的key的时钟是有序的,接下来只有小于(更早)第一个的时钟的key才能放进去,等pool满了,再次放入的时候会把最大的拿出来,该次的放进去,这样pool中维护的数据都是更加长久没有访问的,时钟更小的,等待需要逐出的时候,把pool中时钟最小的淘汰,该pool其实就是一个局部lru池。

数据分布如下图,边界相比2.8版本的较为清晰,但是相比传统lru,还是有一定差距,但是很大程度上减少了刚插入数据的淘汰。

绿色:新加入的数据

深灰色:未删除的数据

浅灰色:已经删除的数据


http://chatgpt.dhexx.cn/article/dSN3KRLT.shtml

相关文章

LRU链表及LRU缓存

注:本文分析基于linux-4.18.0-193.14.2.el8_2内核版本,即CentOS 8.2 1、 关于LRU LRU即Least recently used,也就是最近最少使用,一般用作缓存淘汰上,它的核心思想是——如果一个数据在最近一段时间没有被访问到&…

14.1 LRU链表

在最近几十年操作系统的发展过程中,有很多页面交换算法,其中每个算法都有各自的优点和缺点。linux内核中采用的页面交换算法主要是LRU算法和第二次机会法(second chance)。 LRU链表 LRU是least recently used(最近最少使用)的缩写…

mysql lru_MySQL · 源码分析 · InnoDB LRU List刷脏改进之路

之前的一篇内核月报MySQL 引擎特性 InnoDB Buffer Pool 中对InnoDB Buffer pool的整体进行了详细的介绍。文章已经提到了LRU List以及刷脏的工作原理。本篇文章着重从MySQL 5.7源码层面对LRU List刷脏的工作原理,以及Percona针对MySQL LRU Flush的一些性能问题所做…

图解LRU算法

目录 一、什么是LRU算法? 二、基于双向链表Map实现LRU算法 1. 用双向链表看成cache缓存, 数据存放在链表上的每个节点上。 2. 用Map记录访问cache的历史, 只要访问了 cache就将节点放置Map里。 3. 图解移动节点和淘汰策略过程 三、完整代码 四、借助LinkedHashMap实现 一…

mysql lru_浅析MySQL的lru链表

一、简述传统的LRU链表 LRU:Least Recently Used 相信大家对LRU链表是不陌生的,它算是一种基础的数据结构吧,而且想必面试时也被问到过什么是LRU链表,甚至是让你手写一个LRU链表。 想必你已经知道了MySQL的Buffer Pool机制以及MyS…

LRU实现算法

转载自:https://www.cnblogs.com/Dhouse/p/8615481.html 四种实现方式 LRU 1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过&#x…

Redis LRU算法

一、配置Redis内存淘汰策略 maxmemory 100mbmaxmemory-policy allkeys-lrumaxmemory-samples 5注意:Redis的LRU算法并非完整的实现,而是近似LRU的算法,详细介绍点击这里 二、LRU实现原理 1、双向链表 哈希表 1、哈希表:查找快&…

LRU链表介绍

文章目录 1. 简介2. LRU 组织 2.1 LRU 链表2.2 LRU Cache2.3 LRU 移动操作 2.3.1 page 加入 LRU2.3.2 其他 LRU 移动操作3. LRU 回收 3.1 LRU 更新3.2 Swappiness3.3 反向映射3.4 代码实现 3.4.1 struct scan_control3.4.2 shrink_node()3.4.3 shrink_list()3.4.4 shrink_acti…

LRU页面回收

内存回收算法总是会在一定的时间将一些内存回收, 内存回收算法是通过LRU链表对page页面进行管理的,对于那些新的页面会将其插入到LRU链表头,回收时将返回LRU链表末尾的元素,代表老化程度最高的页面 基本数据结构 typedef struct…

利用数组实现lru

LRU主要包含两个函数,第一个插入一个页面,第二个获得一个页面 主要思路如下,当插入页面的时候,所有的页面向后移动一个单位(若果多出来一个元素舍弃掉),然后把这个页面放到数组首元素 当获得一…

什么是LRU(最近最少使用)算法?

一、什么是LRU? LRU(Least Recently Used),最近最少使用。 是一种【内存管理】算法。 LRU算法基于一种假设: 长期不被使用的数据,在未来被用到的几率也不大。因此,当数据所占内存达到一定阈值时…

什么是LRU算法

什么是LRU LRU 英文全称(Least recently used,最近最少使用)属于典型的内存管理算法。 内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,操作系统会根据哪些数据属于…

LRU缓存实现与原理

概念 LRU是 Least Recently Used 的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的,是根据页面调入内存后的使用情况进行决策了。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似…

LRU算法的详细介绍与实现

1.背景 LRU(least recently used-最近最少使用算法),是一种内存数据淘汰策略,使用常见是当内存不足时,需要淘汰最近最少使用的数据。LRU常用语缓存系统的淘汰策略。 2.LRU原理 LRU最早实在操作系统接触到这个算法的…

LRU原来如此简单

文章目录 前言一、LRU是什么?二、LFU是什么?三、LRU和LFU的比较四、LFU代码实现(看懂LFU就自然懂了LRU了)1、LFU类2、Node类3、测试 写在最后,感谢点赞关注收藏转发 前言 现在缓存技术在项目中随处可见,但…

LRU算法详解

概念理解 1.LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的,是根据页面调入内存后的使用情况进行决策了。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的…

LRU算法

1.什么是LRU算法 LRU算法又称最近最少使用算法,它的基本思想是长期不被使用的数据,在未来被用到的几率也不大,所以当新的数据进来时我们可以优先把这些数据替换掉。 在LRU算法中,使用了一种有趣的数据结构,称为哈希链…

巧用 NGINX 实现大规模分布式集群的高可用性

原文作者:陶辉 原文链接:巧用 NGINX 实现大规模分布式集群的高可用性 - NGINX开源社区 转载来源:NGINX开源社区 本文是我对2019年GOPS深圳站演讲的文字整理。这里我希望带给各位读者的是,如何站在整个互联网背景下系统化地理解Ngi…

朱邦复

朱邦复 求助编辑百科名片 朱邦复,仓颉输入法的发明人,现任香港上市公司文化传信集团的副主席。湖北省黄冈县人。为中文终端机、仓颉输入法、汉卡的发明人。由于其对中文电脑发展的众多贡献,台湾及香港地区的华人誉其为“中文电脑之父”、“中…

TCP/IP的底层队列实现原理

个人博客请访问 http://www.x0100.top 自从上次学习了TCP/IP的拥塞控制算法后,我越发想要更加深入的了解TCP/IP的一些底层原理,搜索了很多网络上的资料,看到了陶辉大神关于高性能网络编程的专栏,收益颇多。今天就总结一下&#…