Redis 过期
Redis 过期为键设置可访问的生命周期,常用于缓存、验证码和短期状态。过期决定何时失效,内存淘汰决定内存压力下删除哪些键,两者需要分别设计。
1. 面试核心
先记住这几条,再读正文- 访问时检查与主动抽样共同处理过期,失效时间不等于物理内存精确释放时间。
- SET 可以同时写值和 TTL,避免分两条命令之间的失败窗口。
- 普通 SET 覆盖值通常会清除已有 TTL,需按语义重新设置或保留。
2. 写入值与 TTL
SET demo:code 123456 EX 60
TTL demo:code
第一条命令把值和 60 秒有效期一起设置。紧接着查询 TTL 通常返回接近 60 的剩余秒数,具体值取决于经过的时间。TTL 返回 −1 表示键存在但没有过期时间,−2 表示键不存在。
若拆成 SET 和 EXPIRE 两条命令,进程在中间失败可能留下没有 TTL 的键。因此单次写入需要过期语义时,应优先使用支持该语义的原子命令。
3. 更新与清理
SET demo:code 654321
TTL demo:code
普通 SET 覆盖后 TTL 变为 −1。需要保留原 TTL 时,可以使用支持 KEEPTTL 的版本和命令语法;需要重新计时则明确指定 EX/PX。修改部分内部值的命令未必清除整个键的 TTL,不能把 SET 的规则推广到所有写命令。
Redis 访问键时可以发现并处理过期,也会主动抽样清理过期键,因此即使没有读请求也会回收一部分过期数据。清理有资源预算,不能把 TTL 当成准点执行任务的调度器。
4. 使用边界
大量键在同一时刻失效会放大回源,通常给 TTL 加入随机扰动,并结合请求合并和限流。但扰动范围必须符合数据可陈旧时间。
验证码、权限和支付状态的业务有效性应在业务逻辑中验证;缓存提前被淘汰、重启丢失或访问延迟都可能影响键是否存在。需要到期执行业务操作时,使用具有确认与补偿机制的任务系统。
5 · 面试题卡片
先想答案,再翻面题目来自公开面经。点任意一张进入翻卡,可左右切换,看完回到这里。
逐张翻看 1 张 →5.1 Redis 如何清理过期键,为什么 TTL 不能当作精确的定时任务?
出现公司:暂无已核验的公开来源(本站自测)
考察重点:访问检查、主动清理与业务定时执行之间的保证差异。
参考回答
过期检查包含访问时检查与主动抽样,受执行时机和清理预算影响。TTL 描述数据何时失效,不保证对应时间点立即触发业务回调或释放全部物理内存。准点任务还需要持久化任务状态、消费确认和失败补偿,不能只监听键删除来保证业务完成。