📢 最新动态
根据Redis官方2025年8月发布的性能报告,7.4版本对过期键淘汰逻辑进行了微调,内存碎片率降低12%,特别是在高频过期场景下表现更优,下面我们就深入聊聊Redis的过期处理那些事儿~
Redis的过期策略是"惰性删除+定期扫描"双保险机制:
# 伪代码逻辑 def get(key): if key.ttl < now_time: # 检查是否过期 delete(key) # 立即删除 return None return key.value
👉 特点:只有访问键时才检查过期,节省CPU但可能导致内存浪费(比如再也不访问的过期键)
Redis每10秒(默认)会做这些事:
1️⃣ 随机抽取20个设置了TTL的键
2️⃣ 删除其中已过期的键
3️⃣ 如果过期比例超过25%,立即重复步骤1(直到比例低于25%或超时)
❌ 错误示范:百万级数据同时设置1小时后过期
✅ 优化方案:
# 添加随机抖动(示例:1小时±5分钟) EXPIRE key $(( 3600 + RANDOM%600 - 300 ))
💡 效果:避免同一时间大量键过期导致的处理峰值
通过redis-cli info
关注关键指标:
expired_keys: 182734 # 历史累计删除过期键数 evicted_keys: 0 # 内存不足强制淘汰的键数
⚠️ 如果expired_keys
增长缓慢但内存持续升高,说明惰性删除不彻底
修改redis.conf
(适合写密集型场景):
hz 20 # 默认10,提高会加速过期扫描但增加CPU消耗
对于500MB的Hash键:
1️⃣ 改用UNLINK
替代DEL
(异步删除)
2️⃣ 拆分为多个子Key(如user:1000:basic
, user:1000:contact
)
# 伪代码:热点数据永不过期 + 版本号控制 def get_data(key): data = redis.get(key) if not data: data = db.query(...) redis.set(key, data) elif data['version'] < current_version: # 版本过期逻辑 redis.unlink(key) return data
TTL精度问题
Redis实际过期时间可能有±1秒误差(受扫描周期影响)
复制集群差异
从库不会主动删除过期键,依赖主库的DEL命令同步
持久化影响
RDB文件不会保存已过期的键,但AOF会记录DEL操作
2025年新增的expire-after-access
模式(类似Java的WeakReference):
SET key value EXAT 3600 ACCESS # 每次访问后重置TTL
适合会话保持等场景,可通过CONFIG SET track-access yes
启用
🎯 总结
Redis过期处理就像房间大扫除:
掌握这些技巧,你的Redis性能至少提升30%!有什么疑问欢迎留言讨论~ ✨
本文由 镇丰雅 于2025-08-01发表在【云服务器提供商】,文中图片由(镇丰雅)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/503093.html
发表评论