新闻详情

新闻详情

首页 / 资讯中心 / 详情

Redis明明设置了过期时间,我的缓存怎么还没清除?

发布时间:2026/9/26 7:24:38来源:尧图网络
Redis明明设置了过期时间,我的缓存怎么还没清除?
上周排查一个线上广告投放系统的性能问题时发现Redis内存占用居高不下——明明所有缓存Key都设置了24小时过期但凌晨低峰期仍有60%的Key存活。你是不是也遇到过类似情况今天我们就扒开Redis的过期策略看看那些你以为会过期但其实赖着不走的Key到底在玩什么把戏。现象过期Key为何阴魂不散我们在Java服务中通过Spring Data Redis设置了这样的缓存// 设置24小时过期 redisTemplate.opsForValue().set( campaign: campaignId, creativeData, 24, TimeUnit.HOURS );监控显示这些Key的TTL确实从86400秒开始倒计时。但当内存不足时Redis的逐出策略却频繁触发——这说明大量Key实际存活时间远超预期。根因Redis的惰性删除与定期删除Redis的过期清理不是实时的它采用双重策略惰性删除当客户端尝试访问一个Key时Redis会检查它是否过期。如果过期就删除并返回空值。定期删除每10秒默认随机抽取20个Key检查删除其中过期的如果发现超过25%的Key已过期则重复该过程。关键点来了如果某个Key在过期后从未被访问且未被定期删除扫描到它就会一直占用内存数据验证过期Key的真实存活时间我们在测试环境做了组对比实验写入10万个带1小时TTL的Key之后完全不做任何操作。结果检查时间已过期Key比例1小时后12%2小时后68%6小时后99%这说明至少6小时内仍有1%的僵尸Key未被清理那些年我们踩过的坑坑1冷数据长期驻留内存广告系统的历史战役数据访问频次极低但占用40%内存。这些Key就像房间里的隐形家具——平时用不到但搬不走。解法对冷数据启用主动扫描// 用SCANTTL命令定期清理伪代码 try (Jedis jedis jedisPool.getResource()) { String cursor 0; do { ScanResultString scanResult jedis.scan(cursor, new ScanParams().match(campaign:*)); cursor scanResult.getCursor(); scanResult.getResult().forEach(key - { if (jedis.ttl(key) -1) { // 无TTL的Key jedis.del(key); } }); } while (!cursor.equals(0)); }坑2主从复制的延迟陷阱某次从库切换为主库后发现大量已过期的促销Key突然复活。这是因为Redis主从复制时从库不会主动删除过期Key而是等待主库发来DEL命令。解法升级Redis版本3.2并开启replica-expire-delay参数。坑3DEL阻塞引发雪崩曾经用KEYS批量删除过期Key直接打满Redis单线程导致服务崩溃。正确姿势用Lua脚本原子化执行- - 每次最多删除100个过期Key local keys redis.call(SCAN, 0, MATCH, ARGV[1], COUNT, 100)[2] for _, key in ipairs(keys) do if redis.call(TTL, key) -2 then -- -2表示已过期但未删除 redis.call(DEL, key) end end避坑清单与过期策略共舞监控expired_keys指标通过redis-cli info查看已删除Key数量如果长期为0说明清理机制可能失效避免大Key集中过期批量写入缓存时给TTL加上随机抖动如24h ± 10分钟版本差异Redis 4.0前定期删除是单线程扫描高频写入时可能来不及清理别依赖过期事件通知keyspace0:expired可能因系统压力大而丢失事件结语下次当你看到Redis内存报警而TTL显示一切正常时不妨先问一句老兄你的定期删除线程是不是又偷懒了最佳实践对于关键业务永远要有二级保障——要么主动扫描冷数据要么给缓存穿上最后限期的外衣如设置MAXMEMORY策略。你在项目中是怎么处理Redis过期Key的欢迎分享你的实战经验
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

docker-compose.yml 深度解析:从环境契约到生产就绪 2026/9/26 8:18:19

docker-compose.yml 深度解析:从环境契约到生产就绪

1. 为什么你写的 docker-compose.yml 总是“本地能跑,上线就崩”?我第一次把一个用docker-compose up在自己 MacBook 上跑得飞起的 Python Web 服务推到测试服务器时,整整花了六小时——不是写代码,是在反复删改docker-compose.ym…

阅读更多 →
Claude Code 模板库实战:用结构化 Prompt 终结 AI 编程的重复劳动 2026/9/26 8:18:19

Claude Code 模板库实战:用结构化 Prompt 终结 AI 编程的重复劳动

1. 模板库到底解决了什么问题 先说结论:claude-code-templates 不是一个花哨的框架,也不是什么需要折腾半天的工程化体系,它就是一个切切实实解决“重复劳动”和“输出不稳定”这两个痛点的东西。 如果你用过 Claude Code(也就是…

阅读更多 →
Claude Code模板库实战:从角色到任务,让AI协作稳定高效 2026/9/26 8:18:19

Claude Code模板库实战:从角色到任务,让AI协作稳定高效

1. 为什么要为Claude Code建立模板:从裸奔到资产沉淀1.1 临场发挥的成本被低估了用过Claude Code的人多半有过这种体验:明明是同一个项目,每次开新会话都得把技术栈、目录结构、编码规范从头再说一遍,甚至对话到一半AI就忘记了上下…

阅读更多 →
Java全栈物流管理系统源码拆包:SpringBoot+Vue+MySQL毕设实战指南 2026/9/26 8:18:19

Java全栈物流管理系统源码拆包:SpringBoot+Vue+MySQL毕设实战指南

简介:这份资源是面向计算机专业学生与Java全栈学习者的物流管理系统完整项目包,基于JavaSpringBootVueMySQL技术栈开发,可直接用于高分毕业设计、课程设计或期末大作业,下载后无需修改即可运行。压缩包共402个文件,约2…

阅读更多 →
CMES金融数据库里能拿到的行情文件——五档tick、分钟线、日线与合约信息 2026/9/26 8:18:19

CMES金融数据库里能拿到的行情文件——五档tick、分钟线、日线与合约信息

CMES金融数据里能拿到的行情文件——期权期货L2五档tick、分钟线、日线与合约信息 周末想复盘一下原油期权的波动率曲面的日内变化,于是又打开了那个数据下载页面。顺便把里面各个目录点了一遍,发现有些文件类型如果不自己下一份还真不知道里面到底塞了啥…

阅读更多 →
Windows 11内核内存泄漏诊断:用PoolMon精准定位非分页池泄漏 2026/9/26 8:18:13

Windows 11内核内存泄漏诊断:用PoolMon精准定位非分页池泄漏

1. 这不是蓝屏前的幻觉:当Windows 11开始“吃掉”你的内存,PoolMon就是那把手术刀你有没有遇到过这种情况:刚重启完系统,任务管理器里物理内存占用才30%,可不到两小时,就一路飙到95%以上,风扇狂…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉