首页/新闻资讯/正文详情

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的欢迎分享你的实战经验

相关推荐

性工作社会语言解码·有罪论 → 日常论·拥有自身语言决定了自身制度
性工作社会语言解码·有罪论 → 日常论·拥有自身语言决定了自身制度

BSD Step 211 ★★★★ 性工作社会语言解码有罪论 → 日常论量级错觉显化拥有自身语言决定了自身制度L1 层:04_社会稳态治理学科 社会语言本体论治理范式解码 ​前承​:Step151(量级错觉公理认知学科第一公理) Step174&#xff0… · 2026/9/26 7:24:38

Spring Boot 3 + LangChain4j 构建企业级RAG应用实战
Spring Boot 3 + LangChain4j 构建企业级RAG应用实战

1. 这不是“又一个Spring Boot教程”,而是企业级AI应用落地的实操切口我带过三支不同行业的AI工程团队,从金融风控到制造业知识管理,最常被问的问题不是“大模型怎么调参”,而是:“老板说下周要上线一个制度问答助手&a… · 2026/9/26 7:24:38

Isaac Gym高扭矩腿式机器人强化学习环境配置与训练避坑指南
Isaac Gym高扭矩腿式机器人强化学习环境配置与训练避坑指南

简介:基于Isaac Gym的HighTorque腿式机器人强化学习环境,面向机器人运动控制与深度强化学习研究者,解决高扭矩关节驱动腿式机器人在仿真环境中的训练与部署难题。资源包共包含63个文件,以Python脚本、STL三维模型和配置文件为核心… · 2026/9/26 7:24:32

UNet改进模型大全:37种改进分类与统一训练验证脚本实战
UNet改进模型大全:37种改进分类与统一训练验证脚本实战

简介:这份资源面向图像分割方向的深度学习学习者与研究者,系统整理了37种UNet改进方案,覆盖注意力机制、特征融合与轻量化主干等主流思路,帮助读者在语义分割任务中快速对比不同模块的增益效果。包内共370个文件,以148… · 2026/9/26 7:57:06

SpringBoot SpringCloud SpringFramework版本对应关系与迁移实战指南
SpringBoot SpringCloud SpringFramework版本对应关系与迁移实战指南

如果你手头正在维护一个 Java 后端项目,或者刚接手别人留下一堆“能跑但没人敢动”的历史代码,那你迟早会和“SpringBoot、SpringCloud、SpringFramework 三者版本对应”这件事撞个满怀。它不是面试里背出来的知识点,而是每次新建工程、每次升… · 2026/9/26 7:57:06

2026 AI智能体RAG优化实战:从切块到检索的全链路调优
2026 AI智能体RAG优化实战:从切块到检索的全链路调优

先问一个问题:2026年了,你的AI智能体是不是还在“一本正经地胡说八道”?不管是制度条例学习助手、电力设计规范查询,还是本地ERP产品检索、电影解说生成器,凡是干过这类活儿的应该都有同感——光有LLM不够,… · 2026/9/26 7:57:06

基于Django+Flask的智能物流配送管理系统设计与实践
基于Django+Flask的智能物流配送管理系统设计与实践

做物流调度最头疼的是什么?我的答案不是订单多,而是"车在外边跑,调度室里两眼一抹黑"。去年接手一个城市配送项目时,每天不到三百单,用Excel排线,靠微信群调度,司机到哪了、哪几单顺路… · 2026/9/26 7:57:06

CTF取证利器foremost:文件雕刻与隐藏信息提取实战指南
CTF取证利器foremost:文件雕刻与隐藏信息提取实战指南

在CTF杂项(Misc)和取证类题目里,文件恢复与隐藏信息提取几乎是绕不开的一环。很多新手拿到一个镜像文件或者一张看似普通的图片,第一反应是用binwalk跑一遍,结果发现只能看到几个文件头,真正需要的内容却提… · 2026/9/26 7:57:06

北大青鸟AI大模型课程深度拆解:RAG、Agent与模型微调实战
北大青鸟AI大模型课程深度拆解:RAG、Agent与模型微调实战

每年都会有人来问我北大青鸟的AI大模型课程到底值不值得学,更多人关心的是:这门课讲的东西,和市面上那些“AI提示词技巧课”到底有什么区别。我的回答向来很直接——真正的AI大模型课程,核心从来不是教你怎么和模型聊天&#xff0… · 2026/9/26 7:57:00

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码