面试题:Redis 数据过期后的删除策略是什么?

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
点赞13 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容