2026-10-31 12:35:19
Redis的过期键删除策略主要包括定时删除、惰性删除和定期删除三种,实际采用惰性删除与定期删除结合的策略。以下是具体说明:
判断键是否过期的方法定时删除:
原理:在设置键过期时间时创建定时器,到达过期时间后立即删除键。
优点:对内存友好,过期键会被及时释放。
缺点:对CPU不友好,大量过期键会占用CPU资源,影响服务器响应和吞吐量。
惰性删除:
原理:仅在访问键时检查是否过期,过期则删除并返回空,未过期则返回键值。
优点:对CPU友好,仅处理当前访问的键。
缺点:对内存不友好,未被访问的过期键会持续占用内存,可能导致内存泄漏。
定期删除:
原理:每隔一段时间检查并删除过期键,通过限制删除时长和频率减少CPU占用。
优点:折中方案,减少内存浪费和CPU压力。
缺点:删除频率和时长需根据业务场景调整,否则可能影响性能或内存使用。
惰性删除实现:通过expireIfNeeded函数实现,所有读写命令执行前调用该函数检查键是否过期。
定期删除实现:通过activeExpireCycle函数实现,定期遍历数据库,随机检查并删除过期键。使用全局变量current_db记录检查进度,确保下次执行时从断点继续。
主服务器模式:过滤过期键,不载入到数据库。
从服务器模式:载入所有键,但主从同步时会清空从服务器数据,因此过期键通常无影响。
过期键未被删除时,AOF不处理。
被惰性或定期删除后,AOF追加DEL命令记录删除操作。
从服务器不主动删除过期键,仅在接到主服务器的DEL命令后删除。
主服务器删除过期键后,会向所有从服务器发送DEL命令。