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,评估过期策略效果。
相关推荐
数据知道19 小时前
PostgreSQL 故障排查:万字详解如何找出数据库中的死锁
数据库·postgresql
AI_567819 小时前
阿里云OSS成本优化:生命周期规则+分层存储省70%
运维·数据库·人工智能·ai
choke23319 小时前
软件测试任务测试
服务器·数据库·sqlserver
龙山云仓19 小时前
MES系统超融合架构
大数据·数据库·人工智能·sql·机器学习·架构·全文检索
IT邦德19 小时前
OEL9.7 安装 Oracle 26ai RAC
数据库·oracle
luffy545920 小时前
windows下通过docker-desktop创建redis实例
windows·redis·docker·容器
时艰.20 小时前
java性能调优 — 高并发缓存一致性
java·开发语言·缓存
jianghua00120 小时前
Django视图与URLs路由详解
数据库·django·sqlite
那我掉的头发算什么20 小时前
【Mybatis】Mybatis-plus使用介绍
服务器·数据库·后端·spring·mybatis
倔强的石头10620 小时前
关系数据库替换用金仓:数据迁移过程中的完整性与一致性风险
数据库·kingbase