惰性删除
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而一直重复操作。