1.基本概念:
Redis 的过期删除策略主要用于管理具有过期时间的键,确保在键过期后适时清除以释放内存。Redis 的过期删除策略主要分为三种方式。
2.惰性删除(Lazy Deletion)
Redis 不主动去删除过期的键,而是在键被访问时才检查它是否过期。如果过期,立即删除并返回空结果。
- 优点:降低了不必要的内存删除操作,节省 CPU 资源。
- 缺点:如果某些键从不被访问,过期后也不会被删除,可能会导致内存占用增多。
3.定期删除(Periodic Deletion)
Redis 会定期随机抽取一部分设置了过期时间的键,检查它们是否过期,并删除过期的键。默认情况下,Redis 每秒执行 10 次这样的检查(可以通过 hz
参数配置频率)。
- 优点:可以清除未被访问的过期键,防止内存过多占用。
- 缺点:是抽样的方式,部分过期键可能会因为没被抽到而延迟删除。
4.定期删除流程
Redis 定期删除策略并不会遍历删除每个过期键,而是采用随机抽取的方式删除过期键,同时为了保证过期扫描不影响 Redis 主业务,Redis 的定期删除策略中还提供了最大执行时间,以保证 Redis 正常并高效的运行。
Redis 定期删除流程如下:
(1).从设置了过期时间的字典中随机取出 20 个键;
(2).删除这 20 个键中过期的键;
(3).如果过期 key 的比例超过 25% ,重复步骤 (1)。
同时为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时间的上限,默认不会超过 25ms。
5.内存淘汰(Eviction Policy)
当 Redis 内存达到上限时,会根据配置的策略选择删除某些键,以腾出空间给新数据。常见的策略有:
- volatile-lru:从设置了过期时间的键中,使用最近最少使用(LRU)策略淘汰。
- allkeys-lru:从所有键中,使用 LRU 策略淘汰。
- volatile-random:从设置了过期时间的键中随机淘汰。
- allkeys-random:从所有键中随机淘汰。
- volatile-ttl:优先淘汰最近要过期的键。
- noeviction:不删除任何键,当内存满时,新写入操作会报错。
总结:
通过结合惰性删除、定期删除和内存淘汰策略,Redis 能在不同场景下灵活管理键的过期和删除,保证内存的高效利用