Redis 中被忽视的“键过期策略”与内存回收机制

背景

很多开发者在使用 Redis 时,习惯性地给 key 设置一个 TTL(Time To Live),认为"到期后 key 就会自动消失"。然而,Redis 的过期删除并不是"准时"的,而是结合了惰性删除 + 定期删除两种策略。如果对此不了解,可能导致:

  • 内存未及时释放,OOM 风险;
  • 业务逻辑误判"key 已过期",实则仍存在。

技术点详解

1. 惰性删除(Lazy Deletion)
  • 当客户端尝试访问某个 key 时,Redis 才会检查该 key 是否已过期。
  • 如果过期,则立即删除并返回 nil。
  • 问题:如果一个 key 过期后长期无人访问,它会一直占用内存!
2. 定期删除(Periodic Deletion)
  • Redis 默认每秒执行 10 次(即每 100ms 一次)定期删除任务。
  • 每次随机抽查一部分设置了过期时间的 key,删除其中已过期的。
  • 问题:抽查是概率性的,无法保证所有过期 key 被及时清理。

开发建议

  • 不要依赖 Redis 过期时间做精确定时任务(如订单超时关闭),应配合定时扫描或延迟队列。
  • 对于高频写入且大量短 TTL 的场景(如验证码缓存),需监控 used_memory 和 expired_keys 指标,防止内存堆积。
  • 可通过 INFO stats 查看 expired_keys 和 evicted_keys,评估过期策略效果。
相关推荐
鬼手点金10 小时前
缓存作为架构约束
开发语言·前端·人工智能·python·microsoft·缓存·架构
Random Glow10 小时前
聚簇索引:为什么主键顺序决定插入性能
数据库·mysql·性能优化·innodb·索引
软件技术NINI10 小时前
基于PHP和MySQL的快递代收点管理系统的设计与实现
开发语言·javascript·数据库·mysql·毕业设计·php·毕设
云上工程笔记10 小时前
2026年大模型Token成本测算推荐清单:输入输出、缓存、并发与峰值用量
人工智能·spring boot·缓存·token
吹什么轩11 小时前
MySQL 增删改查(CRUD)完全指南:从 INSERT 到 GROUP BY
数据库·mysql
为思念酝酿的痛11 小时前
MySQL表的约束
数据库·mysql
Agent世界11 小时前
百度OCR 2开源:KV缓存从47GB压到1.77GB
百度·缓存·开源·大模型·ocr
时间售卖铺11 小时前
MySQL存储过程流程控制全解析
运维·数据库·mysql·云原生
拾起零碎11 小时前
U8/触发器,把自定义项写入批次档案
数据库
独泪了无痕19 小时前
Spring Data Redis 快速上手
spring boot·redis·后端