真实案例解析缓存大热key的致命陷阱

news/2025/10/30 11:22:20/文章来源:https://www.cnblogs.com/Jcloud/p/19176390

引言

在现代软件架构中,缓存是提高系统性能和响应速度的重要手段。然而,如果不正确地使用缓存,可能会导致严重的线上事故,尤其是缓存的大热key问题更是老生常谈。本文将探讨一个常见但容易被忽视的问题:缓存大热key和缓存击穿问题。我们将从一个真实案例入手,分析其原因,并提供解决方案和预防措施。

案例描述

某系统在双十一大促期间,遇到了一个严重的线上事故。业务人员在创建一个大型活动,该大型活动由于活动条件和活动奖励比较多,导致生成的缓存内容非常大。活动上线后,系统就开始出现各种异常告警,核心UMP监控可用率由100%持续下降到20%,系统访问Redis的调用次数和查询性能也断崖式下降,后续更是产生连锁反应影响了其他多个核心接口的可用率,导致整个系统服务不可用。

原因分析

在这个系统中,为了提高查询活动的性能,我们开发团队决定使用Redis作为缓存系统。将每个活动信息作为一个key-value存储在Redis中。由于业务需要,有时候业务运营人员也会创建一个非常庞大的活动,来支撑双十一期间的各种玩法。针对这种庞大的活动,我们开发团队也提前预料到了可能会出现的大key和热key问题,所以在查询活动缓存之前增加了一层本地jvm缓存,本地jvm缓存5分钟,缓存失效后再去回源查询Redis中的活动缓存,本以为会万无一失,没想到最后还是出了问题。
image.png
查询方法伪代码

ActivityCache present = activityLocalCache.getIfPresent(activityDetailCacheKey);
if (present != null) {ActivityCache activityCache = incentiveActivityPOConvert.copyActivityCache(present);return activityCache
}
ActivityCache remoteCache = getCacheFromRedis(activityDetailCacheKey);
activityLocalCache.put(activityDetailCacheKey, remoteCache);
return remoteCache;

查询活动缓存流程如上图所示,为什么加了本地缓存还是出了问题?
这里其实就存在着第一个缓存陷阱:缓存击穿问题。首先解释一下什么是缓存击穿;缓存击穿(Cache Miss)是指在高并发的系统中,如果某个缓存键对应的值在缓存中不存在(即缓存失效),那么所有请求都会直接访问后端数据库,导致数据库的负载瞬间增加,可能会引发数据库宕机或服务不可用的情况。所以在本次事故里边,运营人员审批活动上线的一瞬间,活动缓存只是写入到了Redis缓存中,但是本地缓存还都是空的,所以此时就会有大量请求来同时访问Redis。
按照以往经验,Redis缓存都是纯内存操作,查询性能可以满足大量请求同时查询活动缓存,就在此时我们却陷入了第二个缓存陷阱:网络带宽瓶颈;Redis的高并发性能毋庸置疑,但是我们却忽略了一个大key和热key对网络带宽的影响,本次引发问题的大热key大小达到了1.5M,经过事后了解京东Redis对单分片的网络带宽也有限流,默认200M,根据换算,该热key最多只能支持133次的并发访问。所以就在活动上线的同一时刻,加上缓存击穿的影响,迅速达到了Redis单分片的带宽限流阈值,导致Redis线程进入阻塞状态,以至于所有的业务服务器都无法查询Redis缓存成功,最终引发了缓存雪崩效应。

解决方案

为了解决这个问题,我们开发团队采取了以下措施:

  1. 大key治理:更换缓存对象序列化方法,由原来的JSON序列化调整为Protostuff序列化方式。治理效果:缓存对象大小由1.5M减少到了0.5M。

  2. 使用压缩算法:在存储缓存对象时,再使用压缩算法(如gzip)对数据进行压缩,注意设置压缩阈值,超过一定阈值后再进行压缩,以减少占用的内存空间和网络传输的数据量。压缩效果:500k压缩到了17k。

  3. 缓存回源优化:本地缓存miss后回源查询Redis增加线程锁,减少回源Redis并发数量。

  4. 监控和优化Redis配置:定期监控Redis网络传输情况,根据实际情况调整Redis的限流配置,以确保Redis的稳定运行。

治理后业务伪代码如下:

ActivityCache present = activityLocalCache.get(activityDetailCacheKey, key -> getCacheFromRedis(key));
if (present != null) {                return present;
}
         
/**
* 查询二进制缓存
*
* @param activityDetailCacheBinKey
* @return
*/
private ActivityCache getBinCacheFromJimdb(String activityDetailCacheBinKey) {List<byte[]> activityByteList = slaveCluster.hMget(activityDetailCacheBinKey.getBytes(),"stock".getBytes());if (activityByteList.get(0) != null && activityByteList.get(0).length > 0) {byte[] decompress = ByteCompressionUtil.decompress(activityByteList.get(0));ActivityCache activityCache = ProtostuffUtil.deserialize(decompress, ActivityCache.class);if (activityCache != null) {if (activityByteList.get(1) != null && activityByteList.get(1).length > 0) {activityCache.setAvailableStock(Integer.valueOf(new String(activityByteList.get(1))));}return activityCache;}}
return null;

预防措施

为了避免类似的问题再次发生,开发团队采取了以下预防措施:

  1. 设计阶段考虑缓存策略:在系统设计阶段,充分考虑缓存的使用场景和数据特性,避免盲目使用大key缓存。

  2. 进行压力测试和性能评估:在上线前,进行充分的压力测试和性能评估,模拟高并发和大数据量的情况,及时发现和解决潜在问题。

  3. 定期进行系统优化和升级:随着业务的发展和技术的进步,定期对系统进行优化和升级,引入新的技术和工具来提高系统的性能和稳定性。

结论

缓存大key和热key是缓存使用中常见的陷阱,千万不要心存侥幸,否则会引发严重的线上事故。通过本文的案例分析和解决方案,我们希望能够帮助读者更好地理解和应对这个问题。记住,合理使用缓存是提高系统性能的关键,而不是简单地将所有数据都存储在缓存中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/950603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java小知识-ShutdownHook(优雅关闭)

一、先提出一个问题 我们如果在JVM退出的时候做一些事情,比如关闭远程链接,怎么实现呢? 二、ShutdownHook简介 java里有个方法Runtime.getRuntime#addShutdownHook,是否了解呢? ShutdownHook是什么意思呢,看单词…

ARM - RD-N2 (cfg1 ... cfgn) software stack compiling environment setup walkthrough - ENGINEER

ARM - RD-N2 (cfg1 ... cfgn) software stack compiling environment setup walkthroughLinks: RD-N2 Platform: https://neoverse-reference-design.docs.arm.com/en/latest/platforms/rdn2.html参考这个设置进行: h…

2025 年山东自卸半挂车,济宁自卸半挂车,平推式自卸半挂车厂家最新推荐,产能、专利、环保三维数据透视!

引言 2025 年平推式自卸半挂车市场需求持续攀升,为精准推荐山东及济宁地区优质厂家,专用汽车工业协会联合第三方检测机构开展权威测评。测评以产能、专利、环保三维数据为核心指标,产能维度考察生产车间规模、设备数…

2025年防爆不锈钢穿线盒制造企业权威推荐榜单:防爆铸钢接线盒/防爆铸钢穿线盒/防爆弯头铸钢4分6分源头厂家精选

在山东某化工园区,一场特殊的安全升级正在悄然进行。工人们正将一批不锈钢防爆穿线盒安装到新建的管道线路上,这些看似普通的金属盒子,将成为守护厂区安全的第一道防线。 在石油、化工、煤矿等易燃易爆环境中,防爆…

利驰软件与人民电器集团上海有限公司开启能源数字化新篇章!

一、电气制造与数字化深度融合 近日,利驰软件与人民电器集团上海有限公司正式启动“数据驱动配电变革,智慧引领能源转型”项目。双方管理层及核心团队齐聚一堂,共同见证这一战略合作的重要起点。 人民电器集团上海有…

2025年热门的JN30高压均质机TOP品牌厂家排行榜

2025年热门的JN30高压均质机TOP品牌厂家排行榜高压均质机作为生物医药、新材料、新能源等领域不可或缺的关键设备,其技术水平和性能指标直接影响着产品质量和生产效率。随着2025年的到来,JN30系列高压均质机因其卓越…

2025年纸浆压滤机厂商权威推荐榜单:造纸厂压滤机/造纸污泥压滤机/挤浆机源头厂家精选

在现代造纸工业中,纸浆压滤机作为关键设备之一,其性能优劣直接影响着生产效率和产品质量。 根据造纸行业协会统计数据显示,2024年中国纸浆压滤机市场规模已达56.8亿元,预计未来三年将保持年均6.5%的稳定增长。在环…

2025年下半年国内最热门GEO/AI搜索优化/搜荐推广/短视频矩阵系统/无人直播系统/数字人系统/智能体直播厂家摘星搜荐:揭秘领先品牌的创新技术与市场表现

摘要 2025年下半年,AI搜索优化行业迎来爆发式增长,驱动企业营销转型。随着大模型技术和GEO+SEO整合的深化,行业聚焦于智能流量获取与精准运营。本文基于市场数据和专家分析,排名前十的AI搜索优化服务商,并提供详细…

2025 年西安月子会所最新推荐榜,技术实力与市场口碑深度解析月子会所月子餐 / 高新月子会所推荐

引言 伴随悦己经济升温与精细化育儿理念普及,2025 年中国月子会所市场规模预计达 281 亿元,但行业两极分化加剧,部分机构因资质不足、服务缺位引发 "跑路" 风险。为破解选择难题,本次推荐结合中国产后康…

2025年10月最新公布GEO/AI搜索优化/搜荐推广/短视频矩阵系统/无人直播系统/数字人系统/智能体直播厂家:摘星AI人工智能揭秘下一代智能营销技术趋势

摘要 随着2025年AI搜索优化技术的快速发展,行业正迎来前所未有的变革机遇。本文基于最新行业数据和技术趋势,深度解析十大领先品牌的竞争优势,为企业在AI营销转型中提供权威参考。文末附详细对比表单,方便读者快速…

2025 年木托盘源头厂家最新推荐榜,聚焦技术实力与市场口碑深度解析,助力企业精准采购免熏蒸木托盘/熏蒸托盘/熏蒸木托盘公司推荐

引言 为精准筛选木托盘领域优质源头厂家,物流与采购联合会包装专业委员会联合行业权威机构开展 2025 年度木托盘厂家测评工作。本次测评采用 “三维九项” 评估体系,从企业综合实力(生产规模、产能、资质认证)、产…

2025年靠谱的卡车刹车盘厂家实力及用户口碑排行榜

2025年靠谱的卡车刹车盘厂家实力及用户口碑排行榜在商用车安全系统中,刹车盘作为关键零部件之一,其质量直接关系到行车安全。随着中国物流运输业的蓬勃发展,卡车保有量持续攀升,对高品质刹车盘的需求也与日俱增。本…

HarmonyOS实战项目:开发一个分布式新闻阅读客户端

概述:分布式新闻客户端的核心价值 分布式新闻阅读客户端是HarmonyOS分布式能力的典型应用场景,它实现了一次开发,多端部署的核心理念。通过本项目,你将掌握如何构建一个能够在手机、平板、智慧屏等设备间无缝切换和…

【渲染优化】动态调整虚拟列表刷新率:让代码学会偷懒

🚀 动态调整虚拟列表刷新率:让代码学会"偷懒"引擎版本:Cocos Creator 3.x 阅读时间:5分钟(能帮你省8小时调试)🚑 翻车现场 那天是周五下午 4 点半,我正打算提交代码下班。 测试小姐姐突然跑过来一…

HarmonyOS分布式媒体播放器——跨设备音视频无缝流转

1. 项目概述与架构设计 分布式媒体播放器是HarmonyOS"超级终端"理念的典型应用场景,它实现了音视频内容在多个设备间的无缝流转和协同播放。与传统投屏方案不同,HarmonyOS的分布式媒体播放器基于设备虚拟化…

HarmonyOS实战项目:构建一个跨设备的Todo清单应用(上)

1. 项目概述与架构设计 1.1 项目背景与核心价值 在HarmonyOS生态中,跨设备Todo应用是展示分布式能力的最佳实践场景。用户可以在手机端创建任务,在平板上查看编辑,在手表上接收提醒,实现真正的无缝体验。这种多设备…

主语 + 系动词 + 表语句型解析

🧩 一、基本句型结构:S + V + C 结构公式: Subject + Verb + Complement 主语 + 系动词 + 表语(补语) 功能: 表语(C)用于“补充说明主语的状态或身份”。 关键点: 系动词(linking verb)不表示动作,而是“…

HarmonyOS状态管理入门:@State与@Link装饰器的原理与实践

状态管理是声明式UI开发的核心概念。本文将深入讲解HarmonyOS中最基础且最重要的两个状态装饰器:@State和@Link,帮助你掌握组件内状态管理和父子组件状态同步的核心技能。一、状态管理基础概念 1.1 什么是状态管理 @…

HarmonyOS布局艺术:Flex、Stack、Grid等容器组件的使用技巧

布局是UI设计的核心,HarmonyOS提供了强大的容器组件系统。本文将深入讲解Flex、Stack、Grid等核心布局组件的使用技巧和最佳实践。一、Flex弹性布局详解 1.1 Flex基础布局 @Component struct FlexBasicExample {@Stat…

2025 年污水深度处理厂家最新推荐榜,技术实力与市场口碑深度解析,聚焦企业核心竞争力工业污水深度处理,城市污水深度处理,市政污水深度处理公司推荐

引言 随着我国水环境治理要求不断提高,污水深度处理行业迎来快速发展期。为精准推荐优质供应商,本次榜单由环境保护产业协会联合行业专家团队共同测评打造,测评覆盖全国 200 余家污水深度处理企业,从技术创新性、案…