了解redis过期删除策略前,先了解一下三种过期删除策略:

定期删除策略:

概念:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。(创建定时器删除

优点:

  • 对内存最友好:通过使用定时器,可以保证过期的键会尽可能快地被删除,释放所占内存

缺点:

  • 对cpu最不友好:在过期键比较多的情况下,删除过期键这一行为可能会占用相当一部分cpu的时间,对服务器的响应时间和吞吐量造成影响。

惰性删除策略:

概念:放任键的过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。(使用的时候删除

优点:

  • 对cpu最友好:只有在取出键的时候才会对过期键进行检查,即不需要cpu定期扫描,也不需要创建大量的定时器。

缺点:

  • 对内存最不友好:如果一个键已经过期,但是后面不会被访问到的话,那么就一直保留在数据库中。如果这样的键过多,无疑会占用很大的内存。

定期删除策略:

概念:每隔一段时间,程序就对数据库进行一次检查,删除里面过期的键。至于要删除多少过期键,以及要检查多少个数据库,则有算法决定。(定期扫描删除

优点:

  • 定期删除每隔一段时间执行一次过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对cpu时间的影响;
  • 通过删除过期键,能有效的减少因为过期键而带来的内存浪费

缺点:难以确定删除操作执行的时长和频率

  • 如果删除操作执行得太频繁,或者执行的时间太长,定期删除策略就会退化成定时删除,以至于占用太多cpu的执行时间;
  • 如果删除操作执行的时间太少,或执行时间太短,定期删除策略又会和惰性删除一样,出现内存浪费。

Redis过期删除策略:

redis实际使用的过期键删除策略是定期删除策略惰性删除策略

redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定时遍历这个字典来删除到期的 key。除了定时遍历之外,它还会使用惰性策略来删除过期的 key,所谓惰性策略就是在客户端访问这个 key 的时候,redis 对 key 的过期时间进行检查,如果过期了就立即删除。定时删除是集中处理,惰性删除是零散处理。

通过配合使用这两种删除策略,服务器可以很好地合理使用cpu时间和避免浪费内存空间之间取得平衡。

1.定期删除

Redis 默认会每秒进行十次过期扫描,过期扫描不会遍历过期字典中所有的 key,而是采用了一种简单的贪心策略。

  1. 从过期字典中随机 20 个 key;
  2. 删除这 20 个 key 中已经过期的 key;
  3. 如果过期的 key 比率超过 1/4,那就重复步骤 1;

同时,为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时间的上限,默认不会超过 25ms。

如果某一时刻,有大量key同时过期,Redis 会持续扫描过期字典,造成客户端响应卡顿,因此设置过期时间时,就尽量避免这个问题,在设置过期时间时,可以给过期时间设置一个随机范围,避免同一时刻过期。

a. 如何配置定期删除执行时间间隔

redis的定时任务默认是每秒执行10次,如果要修改这个值,可以在redis.conf中修改hz的值。

redis.conf中,hz默认设为10,提高它的值将会占用更多的cpu,当然相应的redis将会更快的处理同时到期的许多key,以及更精确的去处理超时。 hz的取值范围是1~500,通常不建议超过100,只有在请求延时非常低的情况下可以将值提升到100。

b. 单线程的redis,如何知道要运行定时任务?

redis是单线程的,线程不但要处理定时任务,还要处理客户端请求,线程不能阻塞在定时任务或处理客户端请求上,那么,redis是如何知道何时该运行定时任务的呢?

Redis 的定时任务会记录在一个称为最小堆的数据结构中。这个堆中,最快要执行的任务排在堆的最上方。在每个循环周期,Redis 都会将最小堆里面已经到点的任务立即进行处理。处理完毕后,将最快要执行的任务还需要的时间记录下来,这个时间就是接下来处理客户端请求的最大时长,若达到了该时长,则暂时不处理客户端请求而去运行定时任务。

2.懒惰删除

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

  • 如果键已经过期,那么expireIfNeeded函数将键删除
  • 如果键未过期,那么expireIfNeeded函数不做操作

命令调用expireIfNeeded函数过程如下图

另外因为每个被访问的键都可能被删除,所以每个命令都必须能同时处理键存在以及不存在的情况。 下图表示get命令的执行过程

2. aof/rdb和复制功能对过期键的处理

rdb

  • 生成rdb文件:生成时,程序会对键进行检查,过期键不放入rdb文件。
  • 载入rdb文件:载入时,如果以主服务器模式运行,程序会对文件中保存的键进行检查,未过期的键会被载入到数据库中,而过期键则会忽略;如果以从服务器模式运行,无论键过期与否,均会载入数据库中,过期键会通过与主服务器同步而删除。

aof

  • 当服务器以aof持久化模式运行时,如果数据库中的某个键已经过期,但它还没有被删除,那么aof文件不会因为这个过期键而产生任何影响;当过期键被删除后,程序会向aof文件追加一条del命令来显式记录该键已被删除。
  • aof重写过程中,程序会对数据库中的键进行检查,已过期的键不会被保存到重写后的aof文件中。

复制

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

  • 主服务器在删除一个过期键后,会显式地向所有从服务器发送一个del命令,告知从服务器删除这个过期键;
  • 从服务器在执行客户端发送的读命令时,即使碰到过期键也不会将过期键删除,而是继续像处理未过期的键一样来处理过期键;
  • 从服务器只有在接到主服务器发来的del命令后,才会删除过期键。

部分转载:https://juejin.cn/post/7048988049589895175

Redis过期删除策略相关推荐

  1. Redis过期删除策略和内存淘汰策略

    目录 一.过期删除策略 1.如何设置过期时间? 2.如何判定 key 已过期了? 3.过期删除策略有哪些? 1.定时删除策略 2.惰性删除策略 3.定期删除策略 4.Redis 过期删除策略 5.Re ...

  2. 面试官:Redis 过期删除策略和内存淘汰策略有什么区别?

    作者:小林coding 计算机八股文网站:https://xiaolincoding.com 大家好,我是小林. Redis 的「内存淘汰策略」和「过期删除策略」,很多小伙伴容易混淆,这两个机制虽然都 ...

  3. 【Redis】Redis过期删除策略和内存淘汰策略剖析(Redis专栏启动)

  4. redis详解- 过期删除策略和内存淘汰策略

    设置redis键过期时间 Redis提供了四个命令来设置过期时间(生存时间). ①.EXPIRE <key> <ttl> :表示将键 key 的生存时间设置为 ttl 秒. ② ...

  5. redistemplate.opsforhash设置过期时间_Redis详解(十一)------ 过期删除策略和内存淘汰策略...

    大家好,我是可乐,一个专注原创,乐于分享的程序猿. 本系列教程持续更新,可以微信搜索「 IT可乐 」第一时间阅读.回复<电子书>有我为大家特别筛选的海量免费书籍资料 在介绍这篇文章之前,我 ...

  6. Redis淘汰删除策略

    Redis淘汰删除策略 Redis淘汰删除策略6种淘汰Key策略3种删除过期键策略定时删除惰性删除定期删除其他模块的淘汰处理RDB 快照持久化创建载入AOF 只追加持久化写入重写主从复模式下对过期键的 ...

  7. Redis 缓存删除策略

    Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言 ...

  8. 说说 Redis 缓存删除策略

    Redis 缓存删除策略分为定时删除.定期删除与惰性删除.前两个是主动删除,后一个是被动删除. 1 定时删除 为 key 设置一个过期时间,时间一到,由定时器任务删除这个 key. 优点:节省内存,因 ...

  9. stringredistemplate设置过期时间_Redis的过期删除策略和内存淘汰机制

    Redis的key可以设置过期时间,那是否意味着时间一到就会马上被删除呢? Redis的数据存储大小是有限的,假如内存不足Redis有什么应对策略呢? 本篇文章将介绍一下Redis的过期策略和内存淘汰 ...

  10. redis 数据删除策略和逐出算法

    数据存储和有效期# 在 redis 工作流程中,过期的数据并不需要马上就要执行删除操作.因为这些删不删除只是一种状态表示,可以异步的去处理,在不忙的时候去把这些不紧急的删除操作做了,从而保证 redi ...

最新文章

  1. plsql 为空显示 0 的函数_记住这三个检测函数,彻底清除公式当中的0值
  2. python package_Python之package、module
  3. Tensorflow在python3.7版本的运行并且在pycharm安装tensorflow(亲测)
  4. STL源码剖析---红黑树原理详解下
  5. php广告任务网源码_THINKPHP仿我爱广告任务网|任务网站源码下载基于PHP+MYSQL的在线广告打码任务网站源码...
  6. python网络爬虫系列(0)——爬虫概述 http协议复习
  7. 程 序 测 试 规 范
  8. 最新斗鱼JS逆向分析
  9. Vue双向绑定的实现原理系列(三):监听器Observer和订阅者Watcher
  10. Android心电图动画效果,手把手教你打造一个心电图效果View Android自定义View
  11. Win7 U盘安装Ubuntu16.04 双系统详细教程
  12. 坚持#第303天~补起昨天的、顺便写今天的(昨天又在公司搞zabbix搞到了凌晨1点,结果搞忘了写博客),主要是zabbix监控
  13. guava-retry介绍
  14. 英语背单词软件测试初学者,从背单词APP测试,看中学生背单词的那些弯路
  15. 会解方程会画图的超级计算器
  16. RocksDB 架构
  17. 齐二TK6916/20/26/32系列数控落地铣镗床简介6
  18. 从零带你入门stylegan~stylegan3的技术细节
  19. MSP430+LCD1602显示实验
  20. php 中日期时间函数大全,PHP 中日期时间函数 date() 用法总结

热门文章

  1. 漂浮广告代码、漂浮代码分析(讲解)
  2. MinGW安装及介绍
  3. 用python处理excel视频教程_从零基础开始用Python处理Excel数据(第一季)课件+资料...
  4. 【ROM制作工具】线刷包转卡刷包制作教程
  5. 计算机专业初试,2019初试-计算机专业基础综合-考试大纲
  6. Ubuntu安装MySQL
  7. Ubuntu18.04安装NVIDIA显卡驱动
  8. 小狸智能原创工具·AI伪原创API工具
  9. CANoe软件打不开了怎么办?
  10. SVN如何批量忽略文件和文件夹