一文聊聊Redis中的过期策略

一文聊聊Redis中的过期策略
最新回答
安七

2026-08-03 04:13:06

Redis的过期策略主要包含惰性删除和定期删除两种,通过这两种策略的配合,Redis在合理使用CPU资源和避免内存浪费之间取得平衡。

一、过期键的存储

Redis为每个设置了过期时间的键维护一个独立的字典(expires字典),键为原始键名,值为毫秒级时间戳。例如,键"name"设置30秒过期,其过期时间会被存储为当前时间戳+30000毫秒。所有设置过期时间的操作(如expire、pexpire、expireat、pexpireat)最终都会转换为pexpireat命令,确保时间戳统一为毫秒级。

二、过期策略详解

1. 惰性删除策略

实现机制:由db.c/expireIfNeeded函数实现,所有读写命令执行前都会调用该函数检查键是否过期。若键已过期,则立即删除并返回空结果;若未过期,则正常处理命令。例如,执行GET命令时,会先检查键是否存在且未过期,再返回对应值。

优缺点:

  • 优点:对CPU资源友好,仅在访问键时触发检查,无需维护定时器或定期扫描。
  • 缺点:对内存不友好,若过期键长期未被访问,会持续占用内存空间。例如,大量冷数据过期后未被访问,可能导致内存浪费。

2. 定期删除策略

实现机制:由redis.c/activeExpireCycle函数实现,通过serverCron定时任务(默认每秒10次)触发。每次扫描时,从过期字典中随机选取20个键,删除其中已过期的键。若过期键比例超过25%,则重复扫描,但单次扫描时间上限为25ms,避免阻塞主线程。例如,若某次扫描发现20个键中有10个已过期,则继续扫描下一批20个键。

优缺点:

  • 优点:通过限制扫描频率和时长,平衡CPU使用和内存释放。例如,每秒扫描10次,每次最多25ms,可有效控制资源占用。
  • 缺点:若扫描参数设置不当,可能退化为定时删除(频繁扫描)或惰性删除(扫描不足)。例如,若扫描间隔过长或单次扫描键数过少,可能导致过期键积累。

三、策略配合与注意事项

Redis通过惰性删除和定期删除的配合,既避免了定时删除的高CPU占用,又减少了惰性删除的内存浪费。例如,定期删除主动释放大部分过期键,惰性删除处理剩余少量未被扫描到的过期键。

注意事项:

  • 批量过期问题:若大量键同时过期(如设置相同过期时间),可能导致定期扫描持续占用CPU,引发请求延迟。例如,10万个键同时过期时,Redis可能需多次扫描才能清理完毕。
  • 优化建议:为批量键设置随机过期时间范围(如1-3600秒),分散过期时间,避免集中扫描。例如,将10万个键的过期时间随机设置为1-3600秒,可显著降低扫描压力。