聊聊 Redis 的过期键删除策略

聊聊 Redis 的过期键删除策略
最新回答
︷゛噓低調

2026-10-31 12:35:19

Redis的过期键删除策略主要包括定时删除、惰性删除和定期删除三种,实际采用惰性删除与定期删除结合的策略。以下是具体说明:

判断键是否过期的方法
  • 检查键是否存在于过期字典中(过期字典的key是键,value是long类型的过期时间)。
  • 若存在,取出过期时间并与当前UNIX时间戳比较:若当前时间大于过期时间,则键过期。
三种删除策略
  • 定时删除:

    原理:在设置键过期时间时创建定时器,到达过期时间后立即删除键。

    优点:对内存友好,过期键会被及时释放。

    缺点:对CPU不友好,大量过期键会占用CPU资源,影响服务器响应和吞吐量。

  • 惰性删除:

    原理:仅在访问键时检查是否过期,过期则删除并返回空,未过期则返回键值。

    优点:对CPU友好,仅处理当前访问的键。

    缺点:对内存不友好,未被访问的过期键会持续占用内存,可能导致内存泄漏。

  • 定期删除:

    原理:每隔一段时间检查并删除过期键,通过限制删除时长和频率减少CPU占用。

    优点:折中方案,减少内存浪费和CPU压力。

    缺点:删除频率和时长需根据业务场景调整,否则可能影响性能或内存使用。

Redis实际采用的策略
  • 惰性删除+定期删除:

    惰性删除实现:通过expireIfNeeded函数实现,所有读写命令执行前调用该函数检查键是否过期。

    定期删除实现:通过activeExpireCycle函数实现,定期遍历数据库,随机检查并删除过期键。使用全局变量current_db记录检查进度,确保下次执行时从断点继续。

AOF、RDB和复制功能对过期键的处理
  • 生成RDB文件:执行SAVE或BGSAVE命令时,过期键不会被保存到新RDB文件中。
  • 载入RDB文件:

    主服务器模式:过滤过期键,不载入到数据库。

    从服务器模式:载入所有键,但主从同步时会清空从服务器数据,因此过期键通常无影响。

  • AOF文件写入:

    过期键未被删除时,AOF不处理。

    被惰性或定期删除后,AOF追加DEL命令记录删除操作。

  • AOF重写:过期键不会被载入到数据库。
  • 复制模式:

    从服务器不主动删除过期键,仅在接到主服务器的DEL命令后删除。

    主服务器删除过期键后,会向所有从服务器发送DEL命令。

策略优势
  • 惰性删除+定期删除结合了两种策略的优点,既合理控制CPU使用,又减少内存浪费。