过期策略

如果我们对key设置了失效时间1分钟,1分钟后,Redis 是如何对这个 key 进行删除的呢?

Redis过期策略采用的是惰性删除+定期删除策略。

1.惰性删除

当某个key被设置了过期时间之后,客户端每次对该key的访问(读写)都会事先检测该key是否过期,如果过期就直接删除。

2.定期删除

当某个key被设置了过期时间之后,客户端每次对该key的访问(读写)都会事先检测该key是否过期,如果过期就直接删除(这种是被动删除); 但有一些键只访问一次或者是冷数据,因此需要主动删除,默认情况下Redis每秒检测10次, 检测的对象是所有设置了过期时间的键集合,每次从这个集合中随机检测20个键查看他们是否过期,如果过期就直接删除,如果过期的key比例超过1/4,那就把上述操作重复一次(贪心算法)。同时为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时间的上限,默认不会超过25ms。

如果一个大型的 Redis 实例中所有的 key 在同一时间过期了,会引发什么问题?

这个主动过期 key 的定时任务,是在 Redis 主线程中执行的,也就是说如果在执行主动过期的过程中,出现了需要大量删除过期 key 的情况,那么此时应用程序在访问 Redis 时,必须要等待这个过期任务执行结束,Redis 才可以服务这个客户端请求。此时就会出现,应用访问 Redis 延时变大。

有小伙伴问,扫描不是有 25ms 的时间上限了么,怎么会导致卡顿呢?

假如有 1001 个客户端同时将请求发过来了,然后前 1000 个请求的执行时间都是 25ms,那么第 1001 个指令需要等待多久才能执行?25000ms,25秒,这个就是客户端的卡顿时间,是由服务器不间断的小卡顿积少成多导致的。

大量key集中过期导致卡顿如何解决?

方案一:在设置 key 的过期时间时,增加一个随机时间

redis.expireat(key, expire_time + random(300))

这样一来,Redis 在处理过期时,不会因为集中删除过多的 key 导致压力过大,从而避免阻塞主线程。

方案二:Redis 4.0 以上版本,开启 lazy-free 机制

lazyfree-lazy-expire yes

另外,除了业务层面的优化和修改配置之外,你还可以通过运维手段及时发现这种情况。

运维层面,你需要把 Redis 的各项运行状态数据监控起来,在 Redis 上执行 INFO 命令就可以拿到这个实例所有的运行状态数据。

在这里我们需要重点关注 expired_keys 这一项,它代表整个实例到目前为止,累计删除过期 key 的数量。

你需要把这个指标监控起来,当这个指标在很短时间内出现了突增,需要及时报警出来,然后与业务应用报慢的时间点进行对比分析,确认时间是否一致,如果一致,则可以确认确实是因为集中过期 key 导致的延迟变大。

从库的过期策略: 从库不会进行过期扫描,从库对过期的处理是被动的。主库在 key 到期时,会在 AOF 文件里增加一条 del 指令,同步到所有的从库,从库通过执行这条 del 指令来删除过期的 key。

7.Redis过期策略底层是如何实现的?相关推荐

  1. @cacheable 设置过期时间_缓存面试三连击——聊聊Redis过期策略?内存淘汰机制?再手写一个LRU 吧!...

    大家好,今天我和大家想聊一聊有关redis的过期策略的话题. 听到这里你也许会觉得:"我去,我只是个日常搬砖的,这种偏底层的知识点,我需要care吗?" 话虽如此·,但是兄die, ...

  2. redis 过期策略

    redis 过期策略是:定期删除+惰性删除. 所谓定期删除,指的是 redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除. 假设 redis 里放 ...

  3. Redis 过期策略和淘汰策略

    1.Redis 过期策略 Redis 过期策略用于处理设置了缓存时间的数据,使用定时扫描和惰性删除机制删除到期的缓存数据. Redis 将设置了过期时间的 key 保存在一个独立的字典中,定时扫描就是 ...

  4. redis过期策略与淘汰策略

    redis过期策略与淘汰策略 1.过期策略 2.淘汰策略 3.在哪里配置? 4.Lazy Free 1.过期策略 1.redis中所有的key都可以通过expire命令来设置过期时间,所有被设置了过期 ...

  5. redis过期策略和持久化

    Redis过期策略 注:本文主要参考自<Redis设计与实现> 1.设置过期时间 expire key time(以秒为单位)--这是最常用的方式 setex(String key, in ...

  6. Redis过期策略与内存淘汰机制

    参考博客:https://blog.csdn.net/u010006156/article/details/124914082 Redis过期策略与内存淘汰机制 过期策略简介 作用 redis数据都是 ...

  7. Redis过期策略,如何找到redis中所有过期的key

    提问:如何找到redis中所有过期的key? 这个问题,我也只想到了一种办法,如果有其他比较好的方案,热烈欢迎评论区一展风采哈~ 先说说Redis的删除策略. 1.定时删除 在创建key的时候,为ke ...

  8. redis过期策略和内存淘汰机制

    Redis的过期策略 1 定时过期 每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除.该策略可以立即清除过期的数据,对内存很友好:但是会占用大量的CPU资源去处理过期的数据,从而影 ...

  9. 【带你重拾Redis】Redis过期策略 和 内存淘汰策略(key回收)

    过期策略 我们set key的时候,都可以给一个expire time,就是过期时间,指定这个key比如说只能存活1个小时,我们自己可以指定缓存到期就失效. 如果假设你设置一个一批key只能存活1个小 ...

  10. Redis过期策略及实现原理

    2019独角兽企业重金招聘Python工程师标准>>> 我们在使用redis时,一般会设置一个过期时间,当然也有不设置过期时间的,也就是永久不过期. 当我们设置了过期时间,redis ...

最新文章

  1. 2020年学什么计算机软件,2020年大学计算机软件专业排行榜
  2. 在CISCO交换机上配置SSH
  3. vue-cli 相同页面的跳转,但路由参数不同的情况下 组件状态没有更新的问题是为什么 如何解决
  4. 【转】Castle Windsor之组件注册
  5. poi设置列宽自适应_Sentinel 系统自适应限流原理剖析与实战指导
  6. 2010年终人生的思考
  7. 第三十五章 大唐工厂主
  8. void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
  9. python colorbar设置大小及位置_matplotlib colorbar更改轴大小
  10. 当Python遇上HDF5--性能优化实战
  11. Maven 入门——认识Maven结构
  12. 微信私人心情录小程序源码
  13. 数字图像处理——基于matlab的车牌号识别
  14. EBT 道客巴巴的加密与破解 序章
  15. 内容下沉新时代:在一二线做品质,去三四线接地气
  16. OFDM专题之如何计算OFDM一个符号的功率,功率谱密度
  17. -webkit-touch-callout: none;禁止ios弹出菜单,长按图片保存到手机时
  18. 【JVM技术专题】深入分析CG管理和原理查缺补漏「番外篇」
  19. 3.2 Hadoop简介
  20. 均值,期望,方差,标准差,协方差

热门文章

  1. 三维重建开源代码汇总【保持更新】
  2. 卫星导航开源代码汇总
  3. python 视频教程推荐_求各位大佬推荐Python学习视频教程?
  4. 方法、方法的重载(Overload)与重写(Override)
  5. 韦根协议——STM32收发
  6. gitlab使用教程详细
  7. python 排程问题仿真_APS自动生产排程系统-用户常见问题及解答
  8. 说说“用户无线网络时不时断开重连”的故障!
  9. 六种复杂控制系统简述:串级、分程、比值、前馈、选择性和三冲量控制
  10. React脚手架的配置