Redis 中的数据过期后,并不会立即被删除,而是通过 惰性删除 和 定期删除 两种策略来清理过期数据。这两种策略共同作用,确保过期数据能够被及时清理,同时避免对 Redis 性能造成过大影响。
1. 惰性删除(Lazy Expiration)
惰性删除是 Redis 处理过期数据的主要策略之一。它的核心思想是:在访问 key 时检查是否过期,如果过期则删除。
工作原理:
- 当客户端尝试访问某个 key 时,Redis 会先检查该 key 是否设置了过期时间。
- 如果 key 已过期,Redis 会立即删除该 key,并返回空值(或错误)。
- 如果 key 未过期,Redis 会正常返回数据。
优点:
- 节省 CPU 资源:只有在访问 key 时才会检查过期时间,避免了不必要的 CPU 开销。
- 简单高效:实现简单,对 Redis 的性能影响较小。
缺点:
- 内存占用:如果过期 key 长时间未被访问,可能会导致内存浪费。
- 不及时:过期 key 只有在被访问时才会被删除,可能导致过期数据堆积。
2. 定期删除(Active Expiration)
定期删除是 Redis 处理过期数据的另一种策略。它的核心思想是:定期随机检查一部分 key,并删除其中已过期的 key。
工作原理:
- Redis 会每隔一段时间(默认 100ms)执行一次定期删除操作。
- 每次定期删除操作会随机检查一定数量的 key(默认 20 个),并删除其中已过期的 key。
- 如果发现过期 key 的比例超过 25%,则会继续检查下一批 key,直到过期 key 的比例低于 25%。
优点:
- 及时清理:定期删除可以及时清理过期 key,减少内存占用。
- 可控性:通过调整检查频率和每次检查的 key 数量,可以平衡 CPU 和内存的使用。
缺点:
- CPU 开销:定期删除会占用一定的 CPU 资源,尤其是在过期 key 较多的情况下。
- 不完全清理:由于每次只检查部分 key,可能会有部分过期 key 未被清理。
3. 两种删除策略的结合
Redis 通过 惰性删除 和 定期删除 两种策略的结合,实现了对过期数据的高效清理:
- 惰性删除:确保在访问 key 时能够及时清理过期数据。
- 定期删除:确保即使过期 key 未被访问,也能被定期清理。
这种结合方式既保证了过期数据的及时清理,又避免了对 Redis 性能的过大影响。
4. 配置定期删除策略
可以通过 Redis 配置文件 redis.conf
调整定期删除策略的参数:
hz
:控制定期删除操作的执行频率,默认值为 10(即每秒执行 10 次)。maxmemory-samples
:控制每次定期删除操作检查的 key 数量,默认值为 5。
5. 过期数据的其他注意事项
- 持久化对过期数据的影响:
- 在 RDB 持久化模式下,过期 key 不会被保存到 RDB 文件中。
- 在 AOF 持久化模式下,过期 key 会被记录为
DEL
命令。
- 主从复制对过期数据的影响:
- 在主从复制模式下,过期 key 的删除操作会同步到从节点。
- 从节点不会主动删除过期 key,而是等待主节点的删除命令。
6. 手动删除过期数据
除了 Redis 自动删除过期数据外,还可以通过以下方式手动删除过期数据:
DEL
命令:直接删除指定的 key。DEL key_name
UNLINK
命令:异步删除指定的 key,避免阻塞主线程。UNLINK key_name
总结
Redis 通过 惰性删除 和 定期删除 两种策略来清理过期数据:
- 惰性删除:在访问 key 时检查是否过期,如果过期则删除。
- 定期删除:定期随机检查一部分 key,并删除其中已过期的 key。
这两种策略的结合,既保证了过期数据的及时清理,又避免了对 Redis 性能的过大影响。在实际使用中,可以通过调整配置参数来优化删除策略的性能。
THE END
暂无评论内容