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_memoryexpired_keys 指标,防止内存堆积。
  • 可通过 INFO stats 查看 expired_keysevicted_keys,评估过期策略效果。
相关推荐
q***925110 分钟前
sql实战解析-sum()over(partition by xx order by xx)
数据库·sql
gladiator+12 分钟前
Redis之BigKey的常见问题以及大厂相关面试题
java·数据库·redis
合方圆~小文16 分钟前
AI摄像头精准识别技术依赖于深度算法
数据结构·数据库·数码相机·模块测试
tanxiaomi27 分钟前
Redis相关面试题
数据库·redis·缓存
钮钴禄·爱因斯晨1 小时前
【探索实战】KuratorGitOps 多环境配置管理与合规审计
数据库
Z***G4791 小时前
【零基础学Mysql】常用函数讲解,提升数据操作效率的利器
数据库·mysql
q***06471 小时前
Spring Boot 从 2.7.x 升级到 3.3注意事项
数据库·hive·spring boot
aml258__1 小时前
MySQL 数据库管理入门:从创建到删除(T1)
数据库·mysql·oracle·初学数据库
悦悦欧呐呐呐呐1 小时前
数据库事务是什么,怎么用的
服务器·数据库·oracle
q***64971 小时前
Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚)
java·数据库·spring boot