Redis过期键删除策略

114 阅读1分钟

惰性删除

key过期不会立即删除,每次获取key的时候,会检查key是否过期,如果过期则删除;

优点: 删除只发生在获取key时,CPU占用少;

缺点: 过期key,不在被访问后,不会被删除会占用大量内存;

定时删除

key在设置过期时间时同时创建一个定时器,过期时间到了由定时器来删除key;

优点:内存释放快

缺点:大量定时器被创建,耗时,大量key过期,删除key时CPU占用高;

定期删除

每隔一段时间执行一次删除过期key的操作;

优点: 限制删除key的时间和频率,减少CPU的消耗;定期删除过期key,解决惰性删除的缺点;

缺点:内存友好不如定时删除, CPU友好不如惰性删除

Redis使用的策略

Redis采用定期删除+惰性删除;

Redis会将设置了过期时间的key放入一个独立的字典,默认每隔100ms扫描一次,

①每次随机抽取20个key,

②然后删除过期的key,

③若过期的key超过1/4,重复①扫描,继续删除。

为何不扫描全部呢? key过多单线程的Redis可能卡死,每次扫描时间为25ms,防止每次抽取的key过期超过1/4而一直重复操作。