首页 游戏 软件 资讯 排行榜 专题
首页
AI
CodeGeeX编写防止缓存击穿的健壮代码【缓存击穿】

CodeGeeX编写防止缓存击穿的健壮代码【缓存击穿】

热心网友
80
转载
2026-04-22

防止缓存击穿:四种健壮代码方案深度解析

codegeex编写防止缓存击穿的健壮代码【缓存击穿】

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

在分布式系统中,有一个场景堪称“流量刺客”:某个热点 key 在缓存中失效的瞬间,恰好遭遇海量并发请求。结果呢?所有请求瞬间穿透缓存,直接压向数据库,轻则导致响应延迟飙升,重则引发数据库雪崩。这就是典型的缓存击穿。那么,如何构建健壮的防线?下面这四种经过实战检验的代码方案,或许能给你答案。

一、使用互斥锁(Redis 分布式锁)控制重建缓存

这个思路很直接:当缓存失效时,别让所有线程一拥而上去查数据库。而是通过一把分布式锁,确保同一时刻只有一个线程有权去重建缓存,其他线程则乖乖等待,锁释放后直接读取新鲜出炉的数据即可。

具体怎么实现?第一步,尝试用 Redis 的 SET 命令,以 NX(仅当键不存在时设置)和 PX(设置毫秒级过期时间)的方式,为当前缓存 key 设置一个专属锁,比如 key 命名为 “lock:” + cacheKey,过期时间设个 30 秒防止死锁。

如果 SET 命令返回 OK,恭喜,当前线程拿到了锁。接下来,它就可以安心执行数据库查询,并将结果序列化成 JSON 字符串后写回 Redis 缓存,同时别忘了设置一个合理的业务过期时间,比如 600 秒。完事后,主动删除这个锁 key,释放资源。

如果 SET 命令返回 null,说明锁已经被别的线程持有了。这时候,常见的做法是让线程“稍等片刻”:休眠 50 毫秒后重试获取锁,循环个 20 次。如果重试多次依然失败,为了不影响服务可用性,可以考虑降级策略——比如直接查询数据库(但这次不写回缓存),或者抛出特定的 CacheLoadException 让上层处理。无论如何,最终都要返回查询结果,保证流程闭环。

二、逻辑过期方案(无锁预热)

互斥锁方案虽好,但获取锁失败的线程需要等待,多少有些阻塞。有没有更优雅的无锁方案?逻辑过期应运而生。它的核心在于:缓存物理上永不过期,但 value 里封装一个逻辑过期时间戳。访问时检查这个时间戳,过期了就在后台异步刷新,主线程则立刻返回旧值,实现零等待。

首先,需要定义一个内部数据结构,例如 CacheData 类,包含两个字段:一个是实际的数据对象(data),另一个是逻辑过期时间(expireTime,毫秒时间戳)。写入缓存时,将这个对象序列化存进去,并且不设置 Redis 的 TTL。

读取的时候,反序列化得到 CacheData 对象,然后比较 expireTime 和当前系统时间。如果还没过期,直接返回 data 字段,又快又稳。

如果发现过期了,也别慌。这时候可以尝试去 Redis 设置一个标记 key(比如 “loading:” + cacheKey),利用 SET NX 的原子性,确保只有一个线程能设置成功。拿到“刷新权”的线程,就另起一个异步任务去加载最新数据、更新缓存中的 CacheData(并设置新的逻辑过期时间,比如当前时间加 10 分钟),最后清理掉 loading 标记。而其他没抢到标记的线程,以及在此期间的所有请求,都继续返回旧的、但可用的数据,体验上毫无感知。

三、缓存空对象(针对空查询结果)

缓存击穿有时也源于一种特殊场景:查询一个根本不存在的数据(比如无效的用户 ID)。如果每次请求都穿透到数据库查个空,对资源也是极大的浪费。缓存空对象方案,就是专门用来拦截这类无效请求的。

具体做法是,当数据库查询明确返回 null 或空集合时,我们并不直接放弃,而是将一个特殊的空值标记(例如字符串 "NULL")写入缓存,并给它设置一个较短的 TTL,比如 2 分钟(120000 毫秒)。

这样一来,后续相同的无效请求过来,就会先命中这个带有 “NULL” 标记的缓存。业务代码中只需做一个简单判断:如果缓存 value 等于 “NULL”,就直接返回 null,彻底绕开数据库。为了保证上层业务逻辑透明,通常会在缓存访问层统一做一次转换,将 “NULL” 映射回 Ja va 的 null 引用。

不过,这个方案有个关键点需要注意:空对象的 TTL 不宜设置过长。一般建议不超过 5 分钟。否则,万一这个 key 后来在数据库里有真实数据了,会因为空对象缓存未过期而无法被及时感知,导致数据不一致。

四、热点 key 自动识别与永驻缓存

对于真正的“顶流”热点 key,比如明星八卦、秒杀商品,常规的过期机制本身就是风险。更高级的玩法是主动出击:自动识别出它们,并升级为“永驻缓存”,配以后台心跳刷新,从根本上杜绝击穿。

如何识别热点 key?可以借助 Redis 自身的能力。例如,通过定期执行 INFO commandstats 命令分析命令调用频次,或者使用 SCAN 结合 OBJECT FREQ(如果 Redis 版本支持)来统计访问频率。在应用层,可以部署一个定时任务,比如每 30 秒跑一次,采集访问频率最高的前 100 个 key。

对于识别出的热点 key(比如频率超过 1000 次/秒),检查其剩余存活时间。如果 TTL 小于 3600 秒,就通过执行 EXPIRE key 0 命令,将其转为永不过期状态。

光永驻还不够,数据还得保持新鲜。接下来,为这个 key 启动一个独立的守护线程或定时任务,每隔 300 秒(5 分钟)就异步执行一次数据刷新:重新调用数据加载逻辑,并用新结果覆盖旧缓存。这个刷新过程必须做到不中断主线程响应,所有异常都要在后台捕获并记录日志,失败则沿用旧值。刷新前最好还能校验一下数据库连接的健康状态,如果连接不可用,就跳过本次刷新,避免将故障扩散引发雪崩。

说到底,防止缓存击穿没有银弹,关键在于根据业务场景,理解每种方案的 trade-off,并将其灵活地组合应用到你的架构之中。以上四种方案,从基础的互斥锁到高级的热点探测,希望能为你构建更稳健的系统提供一些切实可行的思路。

来源:https://www.php.cn/faq/2345694.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

最强祖师宗门灵兽饲养秘籍
游戏攻略
最强祖师宗门灵兽饲养秘籍

宗门灵兽完整养成指南:从入门到精通的全方位攻略 在宗门修仙体系中,灵兽不仅是并肩作战的强大伙伴,更是提升宗门整体实力的战略核心。然而,许多道友在成功获取灵兽后,常对后续的培养路径感到困惑。本指南将系统性地为你解析灵兽养成的完整体系,助你高效培育出能征善战、独当一面的专属灵兽,大幅提升宗门战斗力。 一

热心网友
04.22
书伴阅读如何投稿
手机教程
书伴阅读如何投稿

如何向书伴阅读投稿? 在阅读社群里分享自己的感悟、解读甚至是衍生创作,本身就是一件充满乐趣和意义的事。书伴阅读无疑是这样一个理想的分享平台。那么,如何才能让你的稿件成功登上这个平台,与更多同好者见面呢? 第一步:找准你的分享角度 动笔之前,先问问自己:你最想分享什么?是读完一本书后那股不吐不快的激动

热心网友
04.22
这城有良田琅嬛银香囊使用指南
游戏攻略
这城有良田琅嬛银香囊使用指南

琅嬛银香囊:队伍生存的关键拼图与能量引擎 在《这城有良田》的宝具体系中,琅嬛银香囊以其独特的定位脱颖而出。作为一件稀有品质的橙色宝具,它并非追求极致的伤害,而是专注于提升队伍的生存与节奏掌控能力。尤其当你的对手以远程攻击见长,或是你的阵容极度依赖主战宝具技能快速启动时,这件宝具的价值便会充分显现。不

热心网友
04.22
如何分析AWR中的Segment statistics_定位物理读最高的表与索引段
数据库
如何分析AWR中的Segment statistics_定位物理读最高的表与索引段

如何精准定位数据库I O瓶颈:优先分析AWR报告Segment Statistics章节的Physical Reads指标 第一步:聚焦 SEGMENT STATISTICS 中的 Physical Reads 排名 分析AWR报告时,应首先查看「Segment Statistics」章节。该部分默

热心网友
04.22
崩铁4.1版本隐藏乐谱成就解锁攻略
游戏攻略
崩铁4.1版本隐藏乐谱成就解锁攻略

崩坏星穹铁道4 1版本隐藏乐谱成就解锁指南 《崩坏:星穹铁道》4 1版本在“二次元jump”区域新增了两个隐藏成就——“乐园变奏:铁皮人”与“乐园变奏:百变狸猫”。这两个成就的解锁流程非常友好,全程无需战斗,只需找到特定音箱并输入正确乐谱即可。如果你还不清楚具体操作步骤,别担心,本攻略将为你提供详细

热心网友
04.22

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

连亏五个季度后,光伏板块终于盈利了
科技数码
连亏五个季度后,光伏板块终于盈利了

三季报收官,光伏企业交出了近年难得的尚佳成绩 三季报发布完毕,光伏行业总算交出了一份近年来难得的、还算不错的成绩单。市场等这一刻,确实等了挺久。 根据Choice光伏设备板块收录的78家企业财报,整个板块三季度的净利润达到了7 58亿元。这个数字怎么看?不妨对比一下:就在二季度,板块的净亏损还高达4

热心网友
04.22
天龙三号首飞失利:与猎鹰9号对标之路,归零迭代成破局关键
科技数码
天龙三号首飞失利:与猎鹰9号对标之路,归零迭代成破局关键

北京天兵科技天龙三号火箭首飞失利解析 最近,北京天兵科技自主研发的天龙三号大型液体运载火箭,在酒泉卫星发射中心执行首次飞行任务时遭遇失利,这无疑是给国内商业航天关注者带来了一次震动。这款被寄予厚望的火箭,瞄准的是近地轨道20吨级的可回收运力,其设计初衷是通过低成本、高频次的发射模式,抢占一箭36星组

热心网友
04.22
开发者自建48台Mac mini集群,撑起Overcast播客转录
科技数码
开发者自建48台Mac mini集群,撑起Overcast播客转录

苹果芯片实战:48台Mac mini搭建本地AI集群,如何碘伏云端语音识别? 最近科技圈有个挺有意思的消息。知名播客应用Overcast的开发者Marco Arment,自己动手搭了个“大家伙”——一个由48台苹果Mac mini组成的服务器集群。关键是,这个集群没走寻常路,它完全绕开了云端AI服务

热心网友
04.22
领克10+与10全球首秀:高效补能搭配赛道王者,开启纯电高性能新篇
科技数码
领克10+与10全球首秀:高效补能搭配赛道王者,开启纯电高性能新篇

纯电赛道再进化:领克10系列如何重新定义“运动轿车”? 如果问,纯电时代最让人怀念传统燃油车的是什么?很多人会把票投给两件事:说走就走的补能,和随心所欲的操控。最近,领克用一场全球首秀给出了自己的答案。旗下全新的中大型运动轿车领克10,以及更极致的性能版本领克10+联袂登场。这不仅仅是两款新车,更像

热心网友
04.22
Apple Vision Pro新专利曝光:将实现按需定制与组件更换
科技数码
Apple Vision Pro新专利曝光:将实现按需定制与组件更换

苹果正酝酿一款“可自定义”的Vision Pro,核心框架支持模块化拼装 一则来自供应链和专利领域的消息,引起了科技圈的关注。4月8日,有外媒报道指出,苹果似乎并不满足于当前的一体化设计思路,其正在深入探索如何打造一款高度可自定义的Apple Vision Pro。未来的VR AR头显,用户或许能像

热心网友
04.22