Redis 的 key 的过期策略是怎么实现的

在 Redis 中,有一个 expire 命令,用来设置某个 key 的过期时间,当超过这个时间后,这个 key 就被删除了,我们也就获取不到了,但是 Redis 是如何做到对于每一个设置了过期时间的 key 都能按时删除的呢?

1、直接遍历所有的 key

每隔一段时间,Redis 就遍历一遍所有的 key,若某个 key 已经到了或已经超过的过期时间,就将其删除。

这种策略对于 Redis 中的 key 很少时是有效的,但是当 Redis 中的值变得非常多,每遍历一遍所有的 key 就会消耗较多的 CPU 资源,而且由于 Redis 是单线程的程序,若在这里消耗了太多的资源,就导致别的请求无法顺利进行,从而造成程序出现错误。

2、惰性删除

当给某个 key 设置过期时间后,虽然这个 key 已经过期了,但是 Redis 还没有将其删除,当下一次获取到这个 key 后,系统就会判断这个 key 已经到了过期时间,就会将其删除,并且返回 nil。

3、定期删除

与第一种方法类似,但是不是一次性遍历所有的 key,而是只抽取部分 key 进行过期时间的验证,这样就能保证既即时删除了过期的 key,又能保证不会消耗过多的资源。

Redis 使用的是惰性删除与定期删除相结合的策略,同时也提供了一系列的内存淘汰机制。

相关推荐
踏月的造梦星球14 小时前
DMDPC 学习:架构、部署、运维与调优
运维·数据库·学习·架构
韩楚风14 小时前
【参天引擎】事务生命周期 / MVCC / Undo / ACID / 分布式事务 功能域整体解析
数据库·分布式·mysql·架构·cantian
renhongxia115 小时前
世界模型,是“空中楼阁”还是AGI的“最后一块拼图”?
运维·服务器·数据库·人工智能·算法·agi
程序员无隅15 小时前
Coding Agent 为什么压缩上下文后还能继续工作?上下文模块设计拆解
java·开发语言·数据库
愿做无知一猿15 小时前
Nacos连接MySQL异常?DataGrip竟成救星
数据库·mysql
G.O.G.O.G15 小时前
LeetCode SQL 从入门到精通(MySQL)06(上)
数据库·sql·mysql·leetcode
研究员子楚16 小时前
GEO行业发展标准体系白皮书V2.0-第10卷 · 全球篇:跨国标准协同与全球品牌语义治理框架
数据库·人工智能·microsoft·架构·geo
Omics Pro17 小时前
深度学习多组学互作:组内+组间
数据库·人工智能·深度学习·mysql·搜索引擎·自然语言处理
残*影18 小时前
如何优雅地保存MySQL数据变更历史?
数据库·mysql
tellmewhoisi18 小时前
多版本共用redis的token有效期校验(过期重新登录)
java·redis·缓存