文章目录

  • 过期键删除策略
    • 定时删除
    • 惰性删除
    • 定期删除
    • Redis的选择
  • 内存淘汰机制

redis中缓存的数据是有过期时间的,当缓存数据失效时,redis会删除过期数据以节省内存,那redis是怎样怎样的策略来删除过期数据的呢?

过期键删除策略

过期删除策略通常有以下三种

  • 定时删除:在为键设置过期时间的同时创建一个定时器,当过期时间到来时就会触发定时器中的处理函数,立即执行过期键的删除操作
  • 定期删除:每隔一段时间就对数据库进行一次检查,删除其中的过期键。检查的数据库数量及删除的过期键数量由算法决定
  • 惰性删除:不会主动去删除过期键。每次获取键时都会判断获取的键是否过期,如果过期则删除,没过期则返回

其中前两种为主动删除策略,最后一种为被动删除策略。下面就来谈谈这三种策略的优缺点以及Redis中究竟使用的哪一种


定时删除

定时删除策略对于内存来说十分友好,通过定时器能够保证过期键能够在第一时间被删除,而不会一直占用内存。

但是同样的,它对CPU时间非常不友好。在过期键比较多的时候,维护大量的定时器会给CPU带来巨大的压力,即使过期键少的时候,它也会将宝贵的CPU时间用在维护定时器,以及删除和当前任务无关的过期键上,对服务器的响应时间与吞吐量造成了一定的影响。


惰性删除

从开始的描述可以看出,惰性删除对于CPU时间来说是最为友好的,因为我们只会在取出键的时候才会对其进行删除操作,这也就保证了我们不会在执行其他任务的时候又背地里去删除无关的过期键,合理的利用了CPU时间。

但是!!!也正是因为这个原因,使得它对内存极度不友好。如果一个键已经过期,而只要我们不去获取这个键,就不会触发过期检查,那也就意味着他会一直占用这一块内存而不释放

这意味着什么呢?如果我们有非常多的过期键,而这些过期键又恰好因为版本迭代、项目组交替,在后续版本中并没有对其进行访问,那么它可能永远也不会被删除。我们可以将这种情况当成内存泄漏中的一种,对于Redis这种内存数据库来说,这种情况造成的后果十分严重


定期删除

定期删除策略其实是上述两种策略的折中选择。

定期删除策略相对于定时删除策略来说,由于其每隔一段时间才进行一次删除操作,通过限制了删除操作的时常和频率,大大减少了删除操作对CPU时间的影响。

相比于惰性删除,并且由于定期删除过期键,有效地减少了过期键带来的空间浪费。即兼顾了CPU,又避免了内存浪费,是两者的折中选择。

但是上述这些优点的前提,就是我们必须要确定一个合理的删除操作的时长和频率

  • 如果删除操作过于频繁,则又退化成了定时删除策略,浪费了大量的CPU时间
  • 如果删除操作执行过少,则又会像惰性删除一样,出现大量的内存浪费问题。

Redis的选择

下面给出三种的效率对比

CPU:惰性删除 > 定期删除 > 定时删除
内存利用率:定时删除 > 定期删除 > 惰性删除

  • 定时删除占用太多CPU时间,影响服务器的吞吐量和性能,但是很好的避免了内存浪费
  • 惰性删除浪费太多内存,有内存泄漏的风险,但是却保证了CPU的效率
  • 定期删除属于前两种的折中,既保证了CPU时间的合理利用,又避免了内存的浪费

为了能够在合理利用CPU时间与避免浪费内存空间之间取得平衡,Redis同时使用了惰性删除和定期删除。

这样的搭配虽然保证了Redis强大的吞吐量以及响应速度,但是却存在因为没有定时删除机制,所以存在着内存浪费问题。

由于Redis中通常存储的数据量十分庞大,这就导致了定期删除每次只能抽取其中的一部分进行删除,倘若有一部分过期键一直没有被抽取到,并且我们也一直没有访问它来触发惰性删除,这个过期键就会一直存在内存中,如果不进行处理,就可能导致内存耗尽。

为了解决这个问题,Redis又引入了内存淘汰机制


内存淘汰机制

当Redis的内存占用过高时,如果内存不足以容纳新写入的数据,就会通过某种机制来删除一部分键,来减少当前占用的内存,这就是内存淘汰机制。

当前Redis提供了8种内存淘汰策略,除却之前的6种,还有两种Redis4.0后新增的LFU模式:volatile-lfu以及allkeys-lfu

名称 作用
volatile-lru 已设置过期时间的key中,挑选最近最少使用的key淘汰
volatile-lfu 已设置过期时间的key中,挑选最不经常使用的key淘汰
volatile-ttl 已设置过期时间的key中,挑选将要过期的key淘汰
volatile-random 已设置过期时间的key中随机挑选key淘汰
allkeys-lru 所有key中,挑选最近最少使用的key淘汰
allkeys-lfu 所有key中, 挑选最不经常使用的key淘汰
allkeys-random 所有key中随机挑选key淘汰
no-eviction 当内存不足以写入新数据时,写入操作会报错,并且不会淘汰数据(不常用)

乍一看策略很多很难记,其实总共就是四种不同的淘汰策略,以及两种key的选择范围

选择范围

  • allkeys:淘汰的范围为所有的key
  • volatile:淘汰的范围为已设置过期时间的key

淘汰策略

  • LRU:Least recently used,即淘汰最近最少使用的key
  • LFU:Least Frequently Used,即淘汰最不经常使用的key
  • TTL:Time To Live,即淘汰生命时间最短,即将要过期的key
  • Random:随机淘汰

其中LRU和LFU较为常用,如果有想了解其算法原理的,可以看看我的往期博客
高级数据结构与算法 | LRU缓存机制(Least Recently Used)
高级数据结构与算法 | LFU缓存机制(Least Frequently Used)

Redis 过期键删除策略、内存淘汰机制相关推荐

  1. Redis 过期键删除策略

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:八个开源的 Spring Boot 学习资源,你值得拥有个人原创+1博客:点击前往,查看更多 作者:罗曼蒂克 链 ...

  2. Redis的过期键删除策略和内存淘汰机制

    一.过期键的判定 通过过期字典,程序可以用以下步骤检查一个给定键的过期时间: (1)检查给定键是否存在于过期字典:如果存在就取出来过期时间: (2)检查当前的UNIX时间戳是否大于键的过期时间,如果是 ...

  3. redis的过期键删除策略

    Redis 中 key 的过期删除策略 Redis 中提供了三种过期删除的策略 1.定时删除 在设置某个 key 的过期时间同时,我们创建一个定时器,让定时器在该过期时间到来时,立即执行对其进行删除的 ...

  4. Redis系列(五):Redis的过期键删除策略

    Redis系列(五):Redis的过期键删除策略 - 申城异乡人 - 博客园 本篇博客是Redis系列的第5篇,主要讲解下Redis的过期键删除策略. 本系列的前4篇可以点击以下链接查看: Redis ...

  5. Redis之过期键删除策略

    (一)关于键的过期时间或生存时间   我们知道,Redis数据库是基于内存的,但是如果一些不用的键在内存中一直存在,那么久而久之,就有可能会发生oom的情况.所以,redis数据库提供了常用的EXPI ...

  6. 2022-04-12 redis过期key删除策略

    1 定时删除: 在设置键过期时间的同时,创建一个定时器,让定时器在过期时间来临时,立即执行对键的删除操作; 这样做有一个弊端,就是当有很多key同一时间过期的时候,会造成一时间的CPU紧张,从而可能影 ...

  7. Redis系列(四)--内存淘汰机制(含单机版内存优化建议)

    每台redis的服务器的内存都是有限的,而且也不是所有的内存都用来存储信息.而且redis的实现并没有在内存这块做太多的优化,所以实现者为了防止内存过于饱和,采取了一些措施来管控内存. 文章结构: ( ...

  8. oracle定时器定时删除30天前的数据_Redis的过期键删除策略

    对于Redis服务器来说,内存资源非常宝贵,如果一些过期键一直不被删除,就会造成资源浪费, 因此我们需要考虑一个问题:如果一个键过期了,它什么时候会被删除呢? 1. 常见的删除策略 常见的删除策略有以 ...

  9. Redis的过期键删除策略和数据逐出策略

    Redis作为一个高性能的内存NoSQL数据库,其容量受到最大内存限制的限制. 在实际生产环境中使用Redis时,偶然会觉得Redis的内存占用要比自己预想的大.事实上,Redis占用的内存除了保存键 ...

最新文章

  1. python3 列表倒叙_python的列表、元组、字典、集合
  2. C++基础-内存管理
  3. Mysql中使用命令行导入.sql文件新建数据库表(图文)
  4. java 19 - 11 异常的注意事项
  5. Notepad++的json 格式化
  6. Windows环境下基于python3 + selenium构建网络爬虫
  7. Baseline管理
  8. android百度导航实现,Android 集成百度地图实现设备定位
  9. Windows 安装JDK
  10. C++自带排序函数sort( )
  11. 人工智能——支持向量机(SVM)思维导图
  12. 求解两条空间直线的交点(解析解+数值解)
  13. 在繁杂的网页中揪出email地址
  14. 串口打印调试信息(干货)
  15. 柯西定理与留数定理的应用总结
  16. 杨建允:抖快直播电商的运营逻辑是否可以复制
  17. MindManager2020官方中文版思维导图软件使用激活安装免费教程下载
  18. python初级教练员考试题目_JS | 教练,我想做习题8
  19. JAVA并发编程的艺术-读书笔记
  20. 贴息政策打出“组合拳”,院校实验室建设攻略来了(二)!

热门文章

  1. 封装案例-完成开火方法
  2. Hive--优化参数
  3. Ubuntu安装vscode步骤
  4. JDK 是如何判断两个对象是否相同的?判断的流程是什么?
  5. 聊聊flink的Async I/O
  6. 大数据(1) - 虚拟机集群搭建
  7. hihoCoder1353 满减优惠
  8. 5年,我从文员一路晋升到总监,薪资翻了5倍[转]
  9. myBatis之事务管理
  10. Ubuntu Linux 永山(mount)分