7.Redis过期策略底层是如何实现的?
过期策略
如果我们对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过期策略底层是如何实现的?相关推荐
- @cacheable 设置过期时间_缓存面试三连击——聊聊Redis过期策略?内存淘汰机制?再手写一个LRU 吧!...
大家好,今天我和大家想聊一聊有关redis的过期策略的话题. 听到这里你也许会觉得:"我去,我只是个日常搬砖的,这种偏底层的知识点,我需要care吗?" 话虽如此·,但是兄die, ...
- redis 过期策略
redis 过期策略是:定期删除+惰性删除. 所谓定期删除,指的是 redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除. 假设 redis 里放 ...
- Redis 过期策略和淘汰策略
1.Redis 过期策略 Redis 过期策略用于处理设置了缓存时间的数据,使用定时扫描和惰性删除机制删除到期的缓存数据. Redis 将设置了过期时间的 key 保存在一个独立的字典中,定时扫描就是 ...
- redis过期策略与淘汰策略
redis过期策略与淘汰策略 1.过期策略 2.淘汰策略 3.在哪里配置? 4.Lazy Free 1.过期策略 1.redis中所有的key都可以通过expire命令来设置过期时间,所有被设置了过期 ...
- redis过期策略和持久化
Redis过期策略 注:本文主要参考自<Redis设计与实现> 1.设置过期时间 expire key time(以秒为单位)--这是最常用的方式 setex(String key, in ...
- Redis过期策略与内存淘汰机制
参考博客:https://blog.csdn.net/u010006156/article/details/124914082 Redis过期策略与内存淘汰机制 过期策略简介 作用 redis数据都是 ...
- Redis过期策略,如何找到redis中所有过期的key
提问:如何找到redis中所有过期的key? 这个问题,我也只想到了一种办法,如果有其他比较好的方案,热烈欢迎评论区一展风采哈~ 先说说Redis的删除策略. 1.定时删除 在创建key的时候,为ke ...
- redis过期策略和内存淘汰机制
Redis的过期策略 1 定时过期 每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除.该策略可以立即清除过期的数据,对内存很友好:但是会占用大量的CPU资源去处理过期的数据,从而影 ...
- 【带你重拾Redis】Redis过期策略 和 内存淘汰策略(key回收)
过期策略 我们set key的时候,都可以给一个expire time,就是过期时间,指定这个key比如说只能存活1个小时,我们自己可以指定缓存到期就失效. 如果假设你设置一个一批key只能存活1个小 ...
- Redis过期策略及实现原理
2019独角兽企业重金招聘Python工程师标准>>> 我们在使用redis时,一般会设置一个过期时间,当然也有不设置过期时间的,也就是永久不过期. 当我们设置了过期时间,redis ...
最新文章
- 2020年学什么计算机软件,2020年大学计算机软件专业排行榜
- 在CISCO交换机上配置SSH
- vue-cli 相同页面的跳转,但路由参数不同的情况下 组件状态没有更新的问题是为什么 如何解决
- 【转】Castle Windsor之组件注册
- poi设置列宽自适应_Sentinel 系统自适应限流原理剖析与实战指导
- 2010年终人生的思考
- 第三十五章 大唐工厂主
- void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
- python colorbar设置大小及位置_matplotlib colorbar更改轴大小
- 当Python遇上HDF5--性能优化实战
- Maven 入门——认识Maven结构
- 微信私人心情录小程序源码
- 数字图像处理——基于matlab的车牌号识别
- EBT 道客巴巴的加密与破解 序章
- 内容下沉新时代:在一二线做品质,去三四线接地气
- OFDM专题之如何计算OFDM一个符号的功率,功率谱密度
- -webkit-touch-callout: none;禁止ios弹出菜单,长按图片保存到手机时
- 【JVM技术专题】深入分析CG管理和原理查缺补漏「番外篇」
- 3.2 Hadoop简介
- 均值,期望,方差,标准差,协方差