浅谈Redis(2)

一.提出问题

当我们给 Redis 海量 Key 设置了过期时间,Redis 如何感知哪些 Key 已过期、需要回收,哪些仍在有效期?Redis 通过过期键删除策略管理过期数据,官方采用「惰性删除 + 定期删除」组合方案实现过期键清理。

二.redis的过期策略

1.惰性删除(被动删除)

当redis中某个键过期了,不会立刻被删除,等到下一次,客户端访问这个键时,redis会先检验过期状态,若已过期当场删除,再返回空数据

  • 优点:CPU 开销极小,仅在访问时触发检查,闲置 CPU 无无效扫描
  • 缺点:内存浪费风险大。若过期 Key 长期不再被访问,会永久驻留内存,成为僵尸数据

2.定时删除

设置固定周期(默认 100ms),每隔这个时间就从 Redis 里随机抽取指定数量的键,挨个检查是否过期,查到过期键就直接删除

优点:主动释放过期内存,规避惰性删除长期堆积过期 Key 的问题

缺点:Redis 只做抽样抽查,海量过期 Key 可能单次扫不完

并不是采取某一种策略,而是两种策略结合使用

三.使用定时任器删除过期键

1.使用优先级队列

**思路:**创建一个优先级队列 (过期时间早的,优先级高),将被设置了过期时间的键,按照优先级顺序依次放入优先级队列中,最先过期的键放置在队首。定时器开启一个线程只扫描队首的键是否过期(队首是全队列最先过期的数据,队首没到期,队列里剩下所有键都没过期);如果键过期就出队删除,原第二位的键变成新队首,循环处理;没到过期时间,就根据当前时间和队首过期时间算出休眠时长,线程休眠,避免频繁空扫描浪费 CPU,等到休眠结束唤醒线程,再次校验队首。

2.使用时间轮

指针每转到一格,就遍历当前格子链表,删除里面所有过期Key

补充:(1)如果 key 过期时间超过单圈总时长,就挂载多圈标记,指针多转几圈后再处理。

**(2)**单个格子代表100ms时间粒度

相关推荐
行百里er7 小时前
Redis 版本演进、新特性与协议那些事儿
redis·后端
Asurplus8 小时前
【SpringBoot4】3、从SpringBoot4升级Sa-Token1.46.0报错
redis·sa-token·json·jackson·springboot4
笃行35010 小时前
别拿MySQL数据库管理工具硬导:MySQL 迁 KingbaseES 的完整工具链
数据库
风哥2号10 小时前
数据库教程FGMT51‑PostgreSQL实例管理与参数文件
数据库·postgresql
蓝速科技11 小时前
桌面双屏翻译机量产调试:三类场景兼容性破局方案丨蓝速科技
运维·数据库·人工智能·科技·技术分享
达梦数据11 小时前
DMDRS空间数据类型说明:Oracle、DM8、MySQL空间数据类型映射
数据库·mysql·oracle
白远山11 小时前
24小时自助健身房系统开发实战:从需求分析到完整指南
java·开发语言·数据库·数据挖掘·需求分析
达梦数据11 小时前
DMDRS服务与模块的运行步骤
数据库
wdfk_prog12 小时前
ROS教程10:从 gtest 到 rostest——Unit Test、Node 集成测试、rosbag 与 rqt 验证闭环
运维·缓存·docker·容器·ros
让学习成为一种生活方式12 小时前
PMGD:植物线粒体基因组数据库--Journal of Integrative Plant Biology
数据库