当前位置: 首页 > article >正文

Redis 过期键(expires)机制详解

Redis 过期键(expires)机制详解

    • 引言
    • 1. Redis 过期键的基本概念
      • 1.1 什么是过期键?
      • 1.2 如何设置过期时间?
      • 1.3 如何查看键的剩余生存时间?
    • 2. 过期键的存储
    • 3. 过期键的删除策略
      • 3.1 惰性删除(Lazy Expiration)
      • 3.2 定期删除(Periodic Expiration)
      • 3.3 定期删除的工作流程
    • 4. 过期键的持久化
      • 4.1 RDB 持久化
      • 4.2 AOF 持久化
    • 5. 过期键的优化
    • 6. 总结
    • 参考文献


引言

Redis 是一个高性能的键值存储系统,广泛应用于缓存、会话存储、消息队列等场景。为了有效管理内存资源,Redis 提供了键过期功能,允许为键设置生存时间(TTL),当键过期后,Redis 会自动将其删除。本文将深入探讨 Redis 的过期键(expires)机制,包括过期键的存储、删除策略以及相关的工作流程。

1. Redis 过期键的基本概念

1.1 什么是过期键?

在 Redis 中,过期键是指设置了生存时间(TTL)的键。当键的生存时间到期后,Redis 会将其从数据库中删除。过期键的机制使得 Redis 可以自动清理不再需要的数据,从而节省内存资源。

1.2 如何设置过期时间?

Redis 提供了以下命令来设置键的过期时间:

  • EXPIRE key seconds:为键设置过期时间,单位为秒。
  • PEXPIRE key milliseconds:为键设置过期时间,单位为毫秒。
  • EXPIREAT key timestamp:为键设置过期时间,使用 UNIX 时间戳(秒)。
  • PEXPIREAT key timestamp:为键设置过期时间,使用 UNIX 时间戳(毫秒)。

例如,以下命令将键 mykey 的过期时间设置为 60 秒:

EXPIRE mykey 60

1.3 如何查看键的剩余生存时间?

可以使用以下命令查看键的剩余生存时间:

  • TTL key:返回键的剩余生存时间,单位为秒。
  • PTTL key:返回键的剩余生存时间,单位为毫秒。

如果键没有设置过期时间,命令返回 -1;如果键不存在,命令返回 -2

2. 过期键的存储

Redis 使用一个名为 expires 的字典来存储键的过期时间。expires 字典的键是数据库中的键,值是对应的过期时间(以毫秒为单位的 UNIX 时间戳)。

例如,假设我们有一个键 mykey,其过期时间设置为 60 秒,那么在 expires 字典中会有一个条目:

mykey -> 1672502400000  # 假设 1672502400000 是当前时间加上 60 秒后的 UNIX 时间戳

3. 过期键的删除策略

Redis 采用两种策略来删除过期键:

3.1 惰性删除(Lazy Expiration)

惰性删除是指当客户端尝试访问一个键时,Redis 会检查该键是否已过期。如果过期,则删除该键并返回空值。

优点

  • 只有在访问时才会进行删除操作,减少了不必要的 CPU 开销。
  • 对于不常访问的键,不会立即删除,避免了频繁的内存回收操作。

缺点

  • 如果大量过期键长时间未被访问,会导致内存浪费。
  • 对于频繁访问的键,惰性删除的效果较好,但对于不常访问的键,可能会导致内存泄漏。

3.2 定期删除(Periodic Expiration)

定期删除是指 Redis 会定期随机检查一部分键,删除其中已过期的键。定期删除的频率和每次检查的键数量可以通过配置文件进行调整。

优点

  • 可以在一定程度上减少内存浪费,避免大量过期键占用内存。
  • 通过调整检查频率和每次检查的键数量,可以平衡 CPU 开销和内存回收效率。

缺点

  • 会增加 CPU 的开销,尤其是在检查大量键时。
  • 如果检查频率过低,可能会导致过期键长时间未被删除。

3.3 定期删除的工作流程

  1. 随机采样:Redis 会从 expires 字典中随机抽取一定数量的键(默认每次检查 20 个键)。
  2. 检查过期时间:对于每个抽样的键,Redis 会检查其过期时间是否小于当前时间。
  3. 删除过期键:如果键已过期,则将其从数据库和 expires 字典中删除。
  4. 循环检查:如果在上一次检查中发现有过期键被删除,Redis 会继续检查下一批键,直到没有过期键被删除或达到最大检查次数。

4. 过期键的持久化

Redis 提供了两种持久化方式:RDB 和 AOF。过期键在持久化时的处理方式有所不同。

4.1 RDB 持久化

在 RDB 持久化过程中,Redis 会生成一个快照文件(.rdb)。在生成快照时,Redis 会检查键是否已过期,如果过期则不会将其写入快照文件。

优点

  • 生成的快照文件不包含过期键,减少了文件大小。
  • 在恢复数据时,不会加载过期键,节省内存。

缺点

  • 如果 Redis 在生成快照后崩溃,可能会导致部分过期键未被删除。

4.2 AOF 持久化

在 AOF 持久化过程中,Redis 会将每个写操作追加到 AOF 文件中。对于过期键,Redis 会在 AOF 文件中记录一个 DEL 命令,表示该键已被删除。

优点

  • AOF 文件记录了所有写操作,包括过期键的删除操作,保证了数据的完整性。
  • 在恢复数据时,Redis 会重新执行 AOF 文件中的命令,确保过期键被正确删除。

缺点

  • AOF 文件可能会变得非常大,尤其是在有大量过期键的情况下。

5. 过期键的优化

为了减少过期键对 Redis 性能的影响,Redis 采用了一些优化措施:

  1. 渐进式删除:在删除大量键时,Redis 会将删除操作分散到多个事件循环中执行,避免一次性删除过多键导致系统卡顿。
  2. 异步删除:对于大键(如包含大量元素的列表、集合等),Redis 会采用异步删除的方式,将删除操作放到后台线程中执行,避免阻塞主线程。

6. 总结

Redis 的过期键机制是保证系统高效运行的重要组成部分。通过惰性删除和定期删除策略,Redis 能够有效地管理过期键,避免内存浪费。理解 Redis 的过期键机制,有助于我们更好地配置和优化 Redis,以满足不同应用场景的需求。

参考文献

  • Redis 官方文档
  • 《Redis 设计与实现》—— 黄健宏

希望本文能帮助你更好地理解 Redis 的过期键机制。如果你有任何问题或建议,欢迎在评论区留言讨论。


http://www.kler.cn/a/554089.html

相关文章:

  • Linux 内存管理与文件页缓冲区
  • 【二分搜索 C/C++】洛谷 P1873 EKO / 砍树
  • Redis7——基础篇(二)
  • 前端504错误分析
  • leetcode-414.第三大的数
  • 影视大数据分析新范式:亮数据动态代理驱动的实时数据采集方案
  • 文心快码智能体不断发展,真正与AI协同工作
  • 数据治理中 大数据处理一般都遵循哪些原则
  • BDF(MD)
  • VSCode使用Cline插件集成OpenAI教程
  • C#中的MarshalByRefObject
  • Deepseek整合SpringAI
  • 接入DeepSeek后,智慧园区安全调度系统的全面提升
  • var、let、const区别
  • 【系统架构设计师】需求工程
  • java网络编程02 - HTTP、HTTPS详解
  • 关于如何利用群晖Docker搭建Project Zomboid(僵尸毁灭工程)私人服务器-保姆级教程
  • 无人机挂载双光吊舱(高分热成像、4K可见光)白夜侦察搜寻技术详解
  • 百度搜索全面接入DeepSeek-R1满血版:AI与搜索的全新融合
  • C#语言的物联网