以下为知识DOC为大家进行整理的相关内容,希望对大家有所帮助!
面试官ďź说说Redis的过期键删除策略吧ďźďź高â¤ď¸频ďź
划重点ďźRedis的过期键删除策略也是面试đ´中经常会被问的ďź我最近面试ďź被问到了đ˘好几次ă
对于Redis服务器来说ďź内存资源非常đ宝贵ďź如果一些过期键一直不被删除ďź就đ会造成资源浪费ďź因此我们需要考虑一đ个问题ďź如果一个键过期了ďź它什么时候â¤ď¸会被删除呢ďź
1. 常见的删除策略
常见的删đ 除策略有以下3种ďź
在设置键的đ过期时间的同时ďź创建一个定时器ďź让定đ时器在键的过期时间来临时ďź立即执行đ对键的删除操作ă
放任过期键â不管ďź每次从键空间中获取键时ďź检查该đ键是否过期ďź如果过期ďź就删除该键ďź如果đ´没有过期ďź就返回该键ă
每隔一đ段时间ďź程序对数据库进行一次检查ďź删đ 除里面的过期键ďź至于要删除哪些数据đ库的哪些过期键ďź则由算法决定ă
ĺ śä¸ĺŽđćśĺé¤ĺ定期删除为丝ĺ¨ĺé¤ççĽďźć°đć§ĺé¤ä¸şč˘Ťĺ¨ĺé¤ççĽă
接下来我们一đ´一讲解ă
1.1 定时删除ççĽ
定时删除ççĽéđščżä˝żç¨ĺŽćśĺ¨ďź定时删除ççĽĺŻäťĽäżčŻđťčżćéŽĺ°˝ĺŻč˝ĺżŤĺ°č˘Ťĺé¤ďźĺšśéćžčżćđéŽĺç¨çĺ ĺă
ĺć¤ďź定时删除ççĽçäźđçźşçšĺŚä¸ć示ďź
举个例子ďź如果有đ´大量的命令请求等待服务器处理ďź并且đ˛服务器当前不缺少内存ďź如果服务器将đ大量的CPU时间用来删除过期键ďź那么服务đť器的响应时间和吞吐量就会受到影响ă
đˇäšĺ°ąćŻčŻ´ďźĺŚććĺĄĺ¨ĺ坺大éçĺŽćśđĺ¨ďźćĺĄĺ¨ĺ¤çĺ˝äť¤čŻˇćąçć§č˝ĺ°ąäźéđä˝ďźĺć¤RedisçŽĺ嚜沥ć使ç¨定时删除ççĽă
1.2 đ惰性删除ççĽ
惰性删除ççĽĺŞäźĺ¨čˇđĺéŽćść寚éŽčżčĄčżććŁćĽďźä¸äźĺ¨ĺâ¤ď¸é¤ĺ śĺŽćĺ łçčżćéŽčąč´ščżĺ¤çCPUćśé´ă
đĺć¤ďź惰性删除ççĽçäźçźşçšĺŚä¸ć示ďź
举个例子ďź如果数据库有很多的đ过期键ďź而这些过期键又恰好一直没有â¤ď¸被访问到ďź那这些过期键就会一直占用â¤ď¸着宝贵的内存资源ďź造成资源浪费ă
1说说删除.3 定期â删除策略
定期删除ççĽćŻ定时删除çđçĽĺ惰性删除ççĽçä¸ç§ć´ĺćä¸ćšđćĄă
定期删除ççĽćŻéä¸ćŽľćśé´ć§čĄä¸đ揥ĺé¤čżćéŽćä˝ďźĺšśéčżéĺśĺé¤ćđä˝ć§čĄçćśéżĺé˘çćĽĺĺ°ĺé¤ćä˝đ 寚CPUćśé´ç役ĺďźĺćśďźéčż定期删除čżćđŠéŽďźäšććĺ°ĺĺ°äşĺ为čżćéŽč希ćĽđçĺ ĺ澪贚ă
2. Redis使用的过期键删除策略
RedisćđĺĄĺ¨ä˝żç¨çćŻ惰性删除ççĽĺĺŽćĺđé¤ççĽă
2.1 惰性删除ççĽçĺŽç°
čżćéŽçđ惰性删除ççĽçąĺ˝ć°ĺŽç°ďźćć话ĺć°đćŽĺşçRedisĺ˝äť¤ĺ¨ć§čĄäšĺé˝äźč°ç¨ĺ˝ć°đšĺŻščžĺ ĽéŽčżčĄćŁćĽďź
以上đ描述可以使用如下流程图表示ďź
2.2 定期删đ除策略的实现
čżćéŽç定期删除ççĽđťçąĺ˝ć°ĺŽç°ďźćŻĺ˝RedisćĺĄĺ¨çĺ¨ćć§ćä˝âĺ˝ć°ć§čĄćśďźĺ˝ć°ĺ°ąäźč˘Ťč°ç¨ďźĺŽĺ¨č§ĺŽđ çćśé´ĺ ďźĺĺ¤ćŹĄéĺćĺĄĺ¨ä¸çĺ个â¤ď¸ć°ćŽĺşďźäťć°ćŽĺşçĺĺ ¸ä¸éćşćŁćĽä¸đé¨ĺéŽçčżććśé´ďźĺšśĺé¤ĺ śä¸çčżćđéŽă
函数的大体流程为ďź
函数每次运行时ďźđ都从一定数量的数据库中随机取出一đ˘定数量的键进行检查ďź并删除其中的过đ期键ďź比如先从0号数据库开始检查ďź下次đ函数运行时ďź可能就是从1号数据库开始â¤ď¸检查ďź直到15号数据库检查完毕ďź又重新从0đ号数据库开始检查ďź这样可以保证每个đˇ数据库都被检查到ă
划重点ďź
关于定期删đ除的大体流程ďź最近面试时有被问道ďź我đˇ就是按上述描述回答的ă
可能有的面试đ官还会问ďź每次随机删除哪些key呢ďź可以提đ下LRU算法ďźLeast Used最近最少使用ďźďź一般不会再细问ďźđ 不过有兴趣的同学可以深入研究下ă
3. RDB对đ 过期键的处理3.1 生成RDB文件
在执行SAVE命令或đ者命令创建一个新的RDB文件时ďź程序会对â数据库中的键进行检查ďź已过期的键不đŠ会被保存到新创建的RDB文件中ă
举个例子ďźđ如果数据库中包含3个键k1ăk2ăk3ďź并且k2已经过期ďźâ那么创建新的RDB文件时ďź程序只会将k1和k3保đŠ存到RDB文件中ďźk2则会被忽略ă
3.2 载入RDB文件
在启đš动Redis服务器时ďź如果服务器只开启了RDB持久đ化ďź那么服务器将会载入RDB文件ďź
因为主从服务器在进行数据同步ďź完đ´整重同步ďź的时候ďź从服务器的数据库会đ被清空ďź所以一般情况下ďź过期键对载入RDBđ文件的从服务器不会造成影响ă
4. AOF对过期đš键的处理4.1 AOF文件写入
ĺŚćć°ćŽĺşä¸çćâ个éŽĺˇ˛çťčżćďźĺšśä¸ćĺĄĺ¨ĺźĺŻäşAOFćäš đŠĺĺč˝ďźĺ˝čżćéŽč˘Ť惰性删除ćč ĺŽćđĺé¤ĺďźç¨ĺşäźĺAOFćäťśčż˝ĺä¸ćĄDELĺ˝äť¤ďźćžđ ĺźčŽ°ĺ˝čŻĽéŽĺˇ˛č˘Ťĺé¤ă
举个例子ďź如果客đ户端执行命令GET 访问已经过期的键ďź那么đ服务器将执行以下3个动作ďź
4说说删除.2 AOF文件重写
在执đ行AOF文件重写时ďź程序会对数据库中的键đ进行检查ďź已过期的键不会被保存到重đ写后的AOF文件中ă
5.复制功能对过期键的处đ 理
在主从复制模式下ďź从服务器的过期đ键删除动作由主服务器控制ďź
6说说删除. 源码及参考
黄đ健宏 ăRedis设计与实现ă
Java知音ďź专注于Java实用文章đ˘推送ďź不容错过ďź
本文地址: https://www.zhishidoc.com/21723.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 859089669@qq.com 举报,一经查实,本站将立刻删除。