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,评估过期策略效果。
相关推荐
PHP实战开发录1 小时前
MySQL字段加索引为什么没变快
数据库·mysql·php·开发
红红谈说2 小时前
标签化推送与已读统计怎么做?一次通知链路的工程复盘
数据库·消息推送·数字乡村·集合运算·已读回执·标签体系·写入放大
Shadow(⊙o⊙)2 小时前
MySQL索引
数据库·mysql
starzy19903 小时前
Flink 优化之网络缓存优化及参数详解:从数据传输机制到反压原理的生产调优指南
网络·缓存·flink
ShineWinsu4 小时前
对于Redis:string类型的解析
java·c++·redis·分布式·缓存·面试·string
倔强的石头_4 小时前
多环境配置治理:开发、测试、生产连接信息如何隔离
数据库
杨云龙UP4 小时前
一次数据库查询缓慢故障复盘:大表数据增长、SQL全表扫描导致系统响应异常
linux·运维·服务器·数据库·sql·mysql
2501_933670795 小时前
2027 应用统计学秋招选岗指南:统计、SQL、业务指标如何对应岗位
数据库·sql
Alice-YUE5 小时前
向量数据库选型实战:Chroma/Qdrant/Milvus/PgVector 怎么选
数据库·milvus·向量数据库·chroma·rag·qdrant
invicinble5 小时前
python 编程语言 认识维度
开发语言·数据库·python