Redis 过期
Redis 过期按 TTL 控制键的有效期。本文以 Redis 6、7 为基线,负责写入期限、更新规则与过期清理。
1. 面试核心
先记住这几条,再读正文- 过期清理。 Redis 通过访问检查和主动抽样清理过期键。卡 · 面试核心
- 原子设置期限。
SET key value EX 60原子写入值和 60 秒有效期。 - 覆盖与保留 TTL。 普通 SET 覆盖值会清除 TTL,
SET ... KEEPTTL保留原期限。卡 · 更新与清理 - TTL 返回值。 TTL 返回 -1 表示无期限,-2 表示键不存在。卡 · 更新与清理
- 过期通知。 过期通知在实际删除时产生,Pub/Sub 断线消息会丢失。卡 · 过期通知与任务调度
2. 写入值与 TTL
SET 可将值与期限一起写入。
SET demo:code 123456 EX 60
TTL demo:code
TTL 返回剩余秒数,PTTL 返回剩余毫秒数。返回 -1 表示键存在但未设置期限。返回 -2 表示键不存在。
拆成 SET 与 EXPIRE 时,中间存在失败窗口。进程只完成写值便退出,会留下长期有效的键。
3. 更新与清理
普通 SET 替换键值,并清除原 TTL。
SET demo:code 654321
TTL demo:code
此时 TTL 为 -1。Redis 6.0 起,SET 支持 KEEPTTL 保留原期限。需要重新计时时,明确使用 EX 或 PX。
INCR、LPUSH 和 HSET 修改键内数据时保留整键 TTL。PERSIST 主动清除期限。Redis 7.0 起,EXPIRE 支持 NX、XX、GT、LT 条件。
| 条件 | 设置期限的条件 |
|---|---|
| NX | 当前没有期限。 |
| XX | 当前已有期限。 |
| GT | 新期限比当前更晚。 |
| LT | 新期限比当前更早。 |
GT/LT 将无期限视为无限远。条件式延期可避免无意缩短已有有效期。
4. 过期清理与时钟
Redis 访问键时检查是否过期,称为被动过期。后台主动抽样检查带期限的键,回收未被访问的过期数据。清理受执行时间预算限制,物理释放可晚于到期时刻。
期限按绝对 Unix 时间保存。Redis 停机期间时间继续流逝。重新载入时,已到期的键仍应失效。主机时间跳变也会改变键是否到期的判断。
主节点负责产生过期删除,并传播到副本和 AOF。副本保留到期信息;被提升为主节点后,独立承担过期处理。
5. 过期通知与任务调度
键空间通知通过 Pub/Sub 发布事件。通知在 Redis 实际处理过期删除时产生。没有及时清理的键,其通知会晚于 TTL 到点。
订阅客户端断线期间的消息会丢失。因此,通知适合观察事件或触发尽力而为的刷新。支付取消等任务应保留持久化到期时间。消费者按任务状态执行,失败重试并定期补偿扫描。
6. 使用边界
大量键集中失效会增加回源流量。TTL 抖动和加载合并见缓存穿透、击穿、雪崩与热点 Key。
验证码等业务状态应同时记录业务有效期。键存在性还受淘汰与故障恢复影响。到期业务任务应保存可重试的任务状态。
7 · 面试题卡片
本页题目与参考回答
7.1 Redis 如何清理过期键,为什么 TTL 不能当作精确的定时任务?
考察重点:访问检查、主动清理与业务定时执行之间的保证差异。
参考回答
Redis 用访问检查和主动抽样清理过期键。
清理有执行预算,内存释放与通知可晚于到期时刻。TTL 定义键的有效期,业务调度还需确认和恢复机制。因此,可靠到期任务应持久化任务状态并补偿执行。
7.2 SET、INCR、HSET 如何影响已有 TTL,怎样保留或延长期限?
考察重点:替换键值、内部更新和条件过期。
相关内容:更新与清理。
参考回答
普通 SET 清除已有 TTL,SET KEEPTTL 保留期限。
INCR 和 HSET 修改键内数据时保留整键 TTL。Redis 7.0 起可用 EXPIRE key seconds GT 只延长已有期限。TTL 的 -1 表示无期限,-2 表示键不存在。
7.3 能用 Redis 过期通知保证订单准点取消吗?
考察重点:通知时机、投递语义与补偿。
相关内容:过期通知与任务调度。
参考回答
过期通知无法保证准点且可靠地完成取消。
通知发生在实际清理时,断线期间也会丢失消息。订单应保存持久化的到期时间和状态。任务执行需幂等,并用重试和补偿扫描确保恢复。