当前位置:网站首页>面试官:Redis中过期的key是怎么被删除的?
面试官:Redis中过期的key是怎么被删除的?
2022-08-04 20:21:00 【51CTO】

介绍
我们可以给Redis中的key设置过期时间,那么当key过期了,它在什么时候会被删除呢?
如果让我们写Redis过期策略,我们会想到如下三种方案
- 定时删除,在设置键的过期时间的同时,创建一个定时器。当键的过期时间来临时,立即执行对键的删除操作
- 惰性删除,每次获取键的时候,判断键是否过期,如果过期的话,就删除该键,如果没有过期,则返回该键
- 定期删除,每隔一段时间,对键进行一次检查,删除里面的过期键
定时删除策略对CPU不友好,当过期键比较多的时候,Redis线程用来删除过期键,会影响正常请求的响应
惰性删除读CPU是比较有好的,但是会浪费大量的内存。如果一个key设置过期时间放到内存中,但是没有被访问到,那么它会一直存在内存中
定期删除策略则对CPU和内存都比较友好
Redis中key的过期策略
redis过期key的删除策略选择了如下两种
- 惰性删除
- 定期删除
惰性删除
客户端在访问key的时候,对key的过期时间进行校验,如果过期了就立即删除
定期删除
Redis会将设置了过期时间的key放在一个独立的字典中,定时遍历这个字典来删除过期的key,遍历策略如下
- 每秒进行10次过期扫描,每次从过期字典中随机选出20个key
- 删除20个key中已经过期的key
- 如果过期key的比例超过1/4,则进行步骤一
- 每次扫描时间的上限默认不超过25ms,避免线程卡死
因为Redis中过期的key是由主线程删除的,为了不阻塞用户的请求,所以删除过期key的时候是少量多次。源码可以参考expire.c中的activeExpireCycle方法
为什么要了解redis过期key的删除策略?
只有一个目的,让你知道设置key的过期时间为一个随机范围,不能都在同一时间过期,不然频繁的扫描过期字典会造成客户端的请求出现卡顿
参考博客
《Redis深度历险》老钱
边栏推荐
猜你喜欢

搭建MyCat2一主一从的MySQL读写分离

How to promote the implementation of rural revitalization

刷题-洛谷-P1304 哥德巴赫猜想
![[TypeScript] In-depth study of TypeScript enumeration](/img/27/4836e59528bb5a51ffc1cf9961c6b6.png)
[TypeScript] In-depth study of TypeScript enumeration

"WAIC 2022 · hackers marathon" two ants wealth competition invited you to fight!

带你了解数据分布式存储原理

动态数组底层是如何实现的

如何进行AI业务诊断,快速识别降本提效增长点?

零知识证明笔记——私密交易,pederson,区间证明,所有权证明

vscode离线安装插件方法
随机推荐
CAS :80750-24-9(脱硫生物素 NHS 酯)
取证程序分类
Using Baidu EasyDL to realize forest fire early warning and identification
idea源码无法下载
zynq records
刷题-洛谷-P1200 你的飞碟在这儿Your Ride Is Here
seata源码解析:seata server各种消息处理流程
Finished product upgrade program
C#的Dictionary字典集合按照key键进行升序和降序排列
vs Code 运行一个本地WEB服务器
MYSQL gets the table name and table comment of the database
really time ntp service start command
【SQL】触发器同步表数据
SAP UI5 确保控件 id 全局唯一的实现方法
Chrome安装zotero connector 插件
Order of lds links
How to monitor code cyclomatic complexity by refactoring indicators
如何进行AI业务诊断,快速识别降本提效增长点?
c sqlite...
IIC驱动OLED