Redis的过期删除策略
Redis 为了管理内存并移除不再需要的数据,提供了键(key)的过期时间设置功能。当一个键过期后,Redis 会通过特定的策略将其删除。Redis 主要结合了两种删除策略:惰性删除和定期删除。
1. 惰性删除 (Lazy Deletion)
惰性删除是指 Redis 在客户端访问一个键时,会先检查这个键是否已经过期。如果过期,Redis 会立即删除这个键,然后返回空值;如果没过期,则正常返回值。
- 优点:这种策略对 CPU 非常友好,因为它只在必要时才进行删除操作,不会在删除过期键上花费额外的 CPU 时间。
- 缺点:对内存不友好。如果一个键过期后一直没有被访问,它就会一直占用着内存,不会被释放,这在某种程度上可能导致内存泄漏。
2. 定期删除 (Periodic Deletion)
由于惰性删除策略可能导致大量过期键积压在内存中,Redis 还引入了定期删除策略作为补充。
Redis 会每隔一段时间(默认是每秒 10 次),从设置了过期时间的键中随机抽取一部分进行检查,并删除其中已过期的键。这个过程由 activeExpireCycle 函数实现。 这是一个主动的删除过程,旨在清理那些可能永远不会被再次访问的过期键。
- 优点:通过主动清理,可以有效减少因过期键堆积而造成的内存浪费。
- 缺点:这是一个权衡策略。如果删除操作过于频繁或执行时间过长,会占用较多的 CPU 资源,影响服务器的响应性能。因此,Redis 的定期删除是随机且分批进行的,以控制其对 CPU 的影响。
Redis 采用的组合策略
为了在 CPU 性能和内存使用之间取得平衡,Redis 实际上是惰性删除和定期删除两种策略的结合。
- 通过定期删除,Redis 主动清理过期的键,在很大程度上回收了内存。
- 通过惰性删除,Redis 确保了客户端在访问数据时绝对不会获取到已过期的内容。
这种组合策略使得 Redis 能够高效地管理过期键,既避免了大量内存的浪费,又不会对 CPU 造成过大的压力。
主从复制中的过期处理
在主从复制结构中,从节点不会主动删除过期键。当主节点上的一个键过期时(无论是通过惰性删除还是定期删除发现的),主节点会生成一条 DEL 命令,并将其同步给所有的从节点,从节点执行这条 DEL 命令来删除对应的过期键,从而保证主从数据的一致性。