三十六:Redis过期键删除策略[通俗易懂]

redisDb结构的expires字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典:❑过期字典的键是一个指针,这个指针指向键空间中的某个键对象(也即是某个数据库键)。❑过期字典的值是一个longlong类型的整数,这个整数保存了键所指向的数据库键的过期时间——一个毫秒精度的UNIX时间戳。❑定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过…

大家好,又见面了,我是你们的朋友全栈君。

redisDb结构的expires字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典:
❑过期字典的键是一个指针,这个指针指向键空间中的某个键对象(也即是某个数据库键)。
❑过期字典的值是一个long long类型的整数,这个整数保存了键所指向的数据库键的过期时间——一个毫秒精度的UNIX时间戳。

❑定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作。
❑惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
❑定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。
在这三种策略中,第一种和第三种为主动删除策略,而第二种则为被动删除策略。

前面两种删除方式在单一使用时都有明显的缺陷:
❑定时删除占用太多CPU时间,影响服务器的响应时间和吞吐量。
❑惰性删除浪费太多内存,有内存泄漏的危险。
定期删除策略是前两种策略的一种整合和折中:
❑定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响。
❑除此之外,通过定期删除过期键,定期删除策略有效地减少了因为过期键而带来的内存浪费。
定期删除策略的难点是确定删除操作执行的时长和频率:
❑如果删除操作执行得太频繁,或者执行的时间太长,定期删除策略就会退化成定时删除策略,以至于将CPU时间过多地消耗在删除过期键上面。
❑如果删除操作执行得太少,或者执行的时间太短,定期删除策略又会和惰性删除策略一样,出现浪费内存的情况。
因此,如果采用定期删除策略的话,服务器必须根据情况,合理地设置删除操作的执行时长和执行频率

函数每次运行时,都从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键。
❑全局变量current_db会记录当前activeExpireCycle函数检查的进度,并在下一次activeExpireCycle函数调用时,接着上一次的进度进行处理。比如说,如果当前activeExpireCycle函数在遍历10号数据库时返回了,那么下次activeExpireCycle函数执行时,将从11号数据库开始查找并删除过期键。
❑随着activeExpireCycle函数的不断执行,服务器中的所有数据库都会被检查一遍,这时函数将current_db变量重置为0,然后再次开始新一轮的检查工作。

Redis实际使用惰性删除和定期删除两种策略配合。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/129374.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • nginx最全教程_nginx使用教程

    nginx最全教程_nginx使用教程location[=|~|~*|^~]patt{}中括号可以不写任何参数,此时称为一般匹配也可以写参数因此,大类型可以分为3种location=patt{}[精准匹配]locationpatt{}[一般匹配]location~patt{}[正则匹配]——————————————–如何发挥作用?:首先看有没有精准匹配…

    2025年5月23日
    1
  • python 获取B站播放量计算的条件及……

    python 获取B站播放量计算的条件及……

    2021年11月10日
    37
  • ROS远程控制(PC机+TX2进行ROS远程通讯)

    ROS远程控制(PC机+TX2进行ROS远程通讯)

    2020年11月8日
    275
  • 虚拟村庄java_虚拟村庄怎么玩?[通俗易懂]

    虚拟村庄java_虚拟村庄怎么玩?[通俗易懂]那个人生病了,找另外一个人帮他治病1。生火。首先,要一个村民(成年的)到左下方拿干木柴;然后,再要他去左上方去拿干草(位置是海的最上方的一堆花的地方);等他都拿齐后,他都会放到村子中间的一圈石头围成的圈中,这时你再把他拖放到上面他就会生火了。2。水坝。这个任务需要你把村民培养成masterbuilder,而且要工程技术(Engineering)达到2级,否则不会成功。把masterbuil…

    2022年10月22日
    0
  • c# dllimport用法(强中台能力)

    大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比如Windows中的一些功能,C++中已经编写好的一些方法)要重新编写代码,C#有没有方法可以直接都用这些原本已经存在的功能呢?答案是肯定的,大家可以通过C#中的DllImport直接调用这些功能。

    2022年4月11日
    152
  • SheetJS—(js-xlsx)

    SheetJS—(js-xlsx)SheetJS的使用(js-xlsx)使用纯前端的方式实现对excel表格的读取和导出功能github地址:https://github.com/SheetJS/js-xlsx学习地址:https://www.jianshu.com/p/74d4059403051.导入功能实现下载js-xlsx到dist复制出xlsx.full.min.js引入到页面中然后通过File…

    2025年6月18日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号