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,评估过期策略效果。
相关推荐
用户3169353811831 天前
Java连接Redis
redis
倔强的石头_2 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
冬奇Lab2 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
ClouGence3 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
无响应de神3 天前
三、用户与权限管理
数据库·mysql
小小工匠3 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
麦聪聊数据3 天前
数据服务化时代:企业数据能力输出的核心路径
数据库
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
DARLING Zero two♡3 天前
【MySQL数据库】数据类型与表约束
数据库·mysql
ofoxcoding3 天前
在AI API聚合平台配置DeepSeek V3.2提示词缓存实战:快速接入与成本优化指南
人工智能·spring·缓存·ai