2026-08-03 04:13:06
Redis的过期策略主要包含惰性删除和定期删除两种,通过这两种策略的配合,Redis在合理使用CPU资源和避免内存浪费之间取得平衡。
一、过期键的存储
Redis为每个设置了过期时间的键维护一个独立的字典(expires字典),键为原始键名,值为毫秒级时间戳。例如,键"name"设置30秒过期,其过期时间会被存储为当前时间戳+30000毫秒。所有设置过期时间的操作(如expire、pexpire、expireat、pexpireat)最终都会转换为pexpireat命令,确保时间戳统一为毫秒级。
二、过期策略详解
1. 惰性删除策略
实现机制:由db.c/expireIfNeeded函数实现,所有读写命令执行前都会调用该函数检查键是否过期。若键已过期,则立即删除并返回空结果;若未过期,则正常处理命令。例如,执行GET命令时,会先检查键是否存在且未过期,再返回对应值。
优缺点:
2. 定期删除策略
实现机制:由redis.c/activeExpireCycle函数实现,通过serverCron定时任务(默认每秒10次)触发。每次扫描时,从过期字典中随机选取20个键,删除其中已过期的键。若过期键比例超过25%,则重复扫描,但单次扫描时间上限为25ms,避免阻塞主线程。例如,若某次扫描发现20个键中有10个已过期,则继续扫描下一批20个键。
优缺点:
三、策略配合与注意事项
Redis通过惰性删除和定期删除的配合,既避免了定时删除的高CPU占用,又减少了惰性删除的内存浪费。例如,定期删除主动释放大部分过期键,惰性删除处理剩余少量未被扫描到的过期键。
注意事项: