浅谈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时间粒度

相关推荐
cfm_29141 小时前
Redis Stack 零基础入门
数据库·redis·缓存
海南java第二人1 小时前
ClickHouse 列式存储深度解析:优点、缺点与选型实战
数据库·clickhouse
李白客1 小时前
MySQL迁移操作手册:一次完整迁移的实战路径
数据库·mysql
晴天¥2 小时前
Oracle 19c RAC修改监听默认端口
数据库·oracle
皮卡祺q2 小时前
【redis1】基本指令,五大数据类型,存储优化,使用场景】
数据库·redis·缓存
杜子不疼.2 小时前
Agent Skills 的演进治理与 Swarm Skills 自演进
服务器·数据库·microsoft
wanghowie2 小时前
26.v3 核心升级:语义层 + 指标体系——禁止 LLM 直连 SQL
数据库·sql
袋鼠云数栈2 小时前
数栈 V7.0 多模态数据智能平台:打造 AI-Ready 的企业数据底座
大数据·数据结构·数据库·人工智能·数据治理·多模态
Mr. zhihao2 小时前
Redis Bitmap:BitCount、bitTop的使用业务场景
数据库·redis·缓存