Redis过期键删除策略的原理是什么

Redis服务器实际使用的是惰性删除和定期删除两种策略:通过配合使用这两种删除策略,服务器可以很好地在合理使用CPU时间和避免浪费内存空间之间取得平衡。

惰性删除

惰性删除策略对CPU时间来说是最友好的:程序只会在取出键时才对键进行过期检查,这可以保证删除过期键的操作只会在非做不可的情况下进行,并且删除的目标仅限于当前处理的键,这个策略不会在删除其他无关的过期键上花费任何CPU时间。

惰性删除策略的缺点是,它对内存是最不友好的:如果一个键已经过期,而这个键又仍然保留在数据库中,那么只要这个过期键不被删除,它所占用的内存就不会释放。

在使用惰性删除策略时,如果数据库中有非常多的过期键,而这些过期键又恰好没有被访问到的话,那么它们也许永远也不会被删除(除非用户手动执行FLUSHDB),我们甚至可以将这种情况看作是一种内存泄漏——无用的垃圾数据占用了大量的内存,而服务器却不会自己去释放它们,这对于运行状态非常依赖于内存的Redis服务器来说,肯定不是一个好消息。

举个例子,对于一些和时间有关的数据,比如日志(log),在某个时间点之后,对它们的访问就会大大减少,甚至不再访问,如果这类过期数据大量地积压在数据库中,用户以为服务器已经自动将它们删除了,但实际上这些键仍然存在,而且键所占用的内存也没有释放,那么造成的后果肯定是非常严重的。

定期删除

从上面对惰性删除的讨论来看,这删除方式在单一使用时有明显的缺陷:

惰性删除浪费太多内存,有内存泄漏的危险。定期删除策略是前两种策略的一种整合和折中:

定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响。除此之外,通过定期删除过期键,定期删除策略有效地减少了因为过期键而带来的内存浪费。定期删除策略的难点是确定删除操作执行的时长和频率:

如果删除操作执行得太频繁,或者执行的时间太长,定期删除策略就会退化成定时删除策略,以至于将CPU时间过多地消耗在删除过期键上面。

如果删除操作执行得太少,或者执行的时间太短,定期删除策略又会和惰性删除策略一样,出现浪费内存的情况。因此,如果采用定期删除策略的话,服务器必须根据情况,合理地设置删除操作的执行时长和执行频率。

惰性删除策略

过期键的惰性删除策略由db.c/expireIfNeeded函数实现,所有读写数据库的Redis命令在执行之前都会调用expireIfNeeded函数对输入键进行检查:

如果输入键已经过期,那么expireIfNeeded函数将输入键从数据库中删除。

如果输入键未过期,那么expireIfNeeded函数不做动作。

Redis过期键删除策略的原理是什么

expireIfNeeded函数就像一个过滤器,它可以在命令真正执行之前,过滤掉过期的输入键,从而避免命令接触到过期键。

另外,因为每个被访问的键都可能因为过期而被expireIfNeeded函数删除,所以每个命令的实现函数都必须能同时处理键存在以及键不存在这两种情况:

当键存在时,命令按照键存在的情况执行。

当键不存在或者键因为过期而被expireIfNeeded函数删除时,命令按照键不存在的情况执行。

Redis过期键删除策略的原理是什么

定期删除策略的实现

过期键的定期删除策略由redis.c/activeExpireCycle函数实现,每当Redis的服务器周期性操作redis.c/serverCron函数执行时,activeExpireCycle函数就会被调用,它在规定的时间内,分多次遍历服务器中的各个数据库,从数据库的expires字典中随机检查一部分键的过期时间,并删除其中的过期键。

整个过程可以用伪代码描述如下

Redis过期键删除策略的原理是什么

activeExpireCycle函数的工作模式可以总结如下:

函数每次运行时,都从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键。

全局变量current_db会记录当前activeExpireCycle函数检查的进度,并在下一次activeExpireCycle函数调用时,接着上一次的进度进行处理。比如说,如果当前activeExpireCycle函数在遍历10号数据库时返回了,那么下次activeExpireCycle函数执行时,将从11号数据库开始查找并删除过期键。

随着activeExpireCycle函数的不断执行,服务器中的所有数据库都会被检查一遍,这时函数将current_db变量重置为0,然后再次开始新一轮的检查工作。

当服务器运行在复制模式下时,从服务器的过期键删除动作由主服务器控制:

主服务器在删除一个过期键之后,会显式地向所有从服务器发送一个DEL命令,告知从服务器删除这个过期键。

从服务器在执行客户端发送的读命令时,即使碰到过期键也不会将过期键删除,而是继续像处理未过期的键一样来处理过期键

从服务器只有在接到主服务器发来的DEL命令之后,才会删除过期键。

通过由主服务器来控制从服务器统一地删除过期键,可以保证主从服务器数据的一致性,也正是因为这个原因,当一个过期键仍然存在于主服务器的数据库时,这个过期键在从服务器里的复制品也会继续存在。举个例子,有一对主从服务器,它们的数据库中都保存着同样的三个键message、xxx和yyy,其中message为过期键,如图所示。

Redis过期键删除策略的原理是什么

如果这时有客户端向从服务器发送命令GET message,那么从服务器将发现message键已经过期,但从服务器并不会删除message键,而是继续将message键的值返回给客户端,就好像message键并没有过期一样

Redis过期键删除策略的原理是什么

假设在此之后,有客户端向主服务器发送命令GET message,那么主服务器将发现键message已经过期:主服务器会删除message键,向客户端返回空回复,并向从服务器发送DEL message命令

Redis过期键删除策略的原理是什么

从服务器在接收到主服务器发来的DEL message命令之后,也会从数据库中删除message键,在这之后,主从服务器都不再保存过期键message了

Redis过期键删除策略的原理是什么

以上就是关于“Redis过期键删除策略的原理是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

文章标题:Redis过期键删除策略的原理是什么,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/22557

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年9月2日 下午10:06
下一篇 2022年9月2日 下午10:07

相关推荐

  • java IP归属地功能如何实现

    第一步:如何拿到用户的真实IP 大家都知道,我们一般想访问公网,一般必须具备上网环境,那么我们开通宽带之后,运营商会给我们分配一个IP地址。一般IP地址我们都是自动分配的。所以我们不知道本机地址是什么?想知道自己的ip公网地址,可以通过百度搜索IP查看自己的ip位置 那么问题来了。百度是怎么知道我的…

    2022年9月6日
    13300
  • windows谷歌浏览器看视频卡顿如何解决

    解决方法: 方法一: 1、在地址栏输入“chrome://plugins”,随后点击右上角的“+详细信息”。 2、选择停用类型为PPAPI的插件,返回视频查看是否有问题。 方法二: 1、点击浏览器右上方的三个带你进入设置界面。 2、进入设置后点击“显示高级设置”, 3、随后取消勾选“关闭Google…

    2022年9月8日
    38400
  • ppt中分数如何打出来

    分数打出来ppt方法: 方法一: 第一步,先在想要输入分数的地方“插入”一个“文本框” 第二步,在其中输入数字,再按下回车,然后按下“shift+——”键 第三步,输入完成再按回车并输入数字就能形成一个分数了。 方法二: 第一步,点击“插入”下的“公式”按钮。 第二步,点击第二行第二列的按钮就是“分…

    2022年8月29日
    40700
  • windows edge浏览器弹窗如何关闭

    edge浏览器关闭弹窗的方法: 1、在浏览器中点击右上角三个点,选择“设置”。 2、在左侧任务栏选择“隐私和安全性”。 3、下拉找到“安全性”将“阻止弹出窗口”的开关打开。 以上就是“windows edge浏览器弹窗如何关闭”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获…

    2022年9月8日
    15500
  • windows谷歌浏览器怎么禁用js

    谷歌浏览器禁用js的方法: 1、点击左上角的三个点然后点击“设置”。 2、进入后下滑点击最下方的“高级”。 3、之后点击“内容管理”。 4、点击开关即可禁用js插件。 以上就是“windows谷歌浏览器怎么禁用js”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都…

    2022年9月8日
    8500
  • imazing请通过usb连接问题怎么解决

    imazing请通过usb连接解决方法 1、我们第一次使用imazing连接电脑和手机是必须要使用usb线的,将usb线一头插在手机上一头插在电脑上。 2、连上之后我们需要在手机上进行确认。 3、确认信任之后就可以使用了。 到此,相信大家对“imazing请通过usb连接问题怎么解决”有了更深的了解…

    2022年9月16日
    12700
  • 如何使用JQuery的turn.js库来实现翻书效果

    实现效果如下 官方示例代码: html: <div id = “ flipbook” > <div class = “ hard” > Turn.js </ div> <div class = “ hard” > </ div> <d…

    2022年9月8日
    24500
  • 如何分析SQLMap和SQLi注入防御

    第一部分:Sqlmap使用 1.1 sqlmap介绍 1. 前边说了一些sql注入的基础语句,但是手工注入很麻烦,我们可以借助sqlmap这个强大的sql注入工具,进行数据的获取. 2. sqlmap介绍 (1)#sqlmap是一种开源的渗透测试工具,可以自动检测和利用SQL注入漏洞以及接入该数据库…

    2022年9月16日
    14900
  • MySql如何查出符合条件的最新数据行

    结合示例: 这是一张记录人员来访的记录表。 数据表里的数据准确记录了每个人来访时带的帽子颜色、时间、人员编码(每个人唯一)。 数据样例: 需要做到的是 : 拿出符合条件的最新的来访记录。 你会最怎么做? 先实现一点的, 取出 A101 这个人员编码的 最新来访记录 。 首先先展示错误的sql示例: …

    2022年9月16日
    13400
  • vue包不包含jQuery

    vue中不包含jquery;vue是一个用于创建用户界面的开源JavaScript框架,虽然jquery也是一个JavaScript框架,但是jquery是使用选择器选取DOM对象,对其进行赋值、取值、事件绑定等操作,而vue对数据进行操作不再需要引用响应的DOM对象,二者并不存在包含的关系。 本文…

    2022年9月8日
    6400
联系我们
站长微信
站长微信
分享本页
返回顶部