惰性删除
很多用户误以为Redis中的过期键到达设定时间后会自动消失,实际上这是一种常见误解。如果Redis每秒对所有键进行扫描,CPU资源将不堪重负。因此,真实策略是:只有在需要访问某个键时,Redis才会检查其是否过期,若过期则立即删除。这种机制被称为“惰性删除”,虽然节省CPU,但存在明显隐患:过期键若无人访问,将长期驻留内存,久而久之可能导致内存泄漏。正是由于这一缺陷,Redis引入了“定期删除”机制作为补充。

定期删除
针对惰性删除留下的“过期残留”问题,Redis主线程会定期随机抽样一批键。若抽到过期键则立即清理,并统计过期键在样本中的占比。若比例偏高,说明内存中可能积压了大量过期数据,主线程会主动触发下一次定期删除任务,而非等待默认间隔。这听起来像无限循环扫描?实际上,主线程内置了超时熔断机制——每次定期删除任务执行到一定时长后强制暂停,优先处理客户端请求。这样既保证了清理效率,又避免CPU被完全占用。
值得一提的是,从Redis 4.0版本开始,这部分流程又做了优化:主线程不再亲自执行内存释放的脏活累活,而是先评估需要释放的空间大小,如果内存较大,就断开指针连接,交由后台的lazy_free线程逐步清理。这样一来,主线程可以更快地回去服务客户端,整个系统的响应延时也更稳了。
