缓存穿透对大促数据库的隐性压力有多大,缓存穿透怎么解决?

大促期间缓存穿透会被高并发流量无限放大,导致本该由Redis扛住的请求直接打到数据库上,引发连接池耗尽甚至雪崩,必须在入口层用参数校验、布隆过滤器或空值缓存提前拦截。

缓存穿透怎么解决?先看大促场景下的真实危害

平时缓存穿透像个小偷,偶尔来一次,数据库打个喷嚏就过去了,但大促不一样,流量是平时的几十倍甚至上百倍,穿透请求也跟着成倍放大。

Redis三大常见缓存问题缓存击穿、缓存雪崩、缓存穿透
加载中
Redis三大常见缓存问题缓存击穿、缓存雪崩、缓存穿透
j
java架构师百里
4306--
原视频地址

大促流量如何把穿透变成灾难

想象一下这个场景:零点秒杀刚开始,用户疯狂点击一个不存在的商品ID,这个ID既不在Redis里,也不在MySQL里,每个请求都绕过缓存直达数据库,而数据库每条查询都要走一遍完整的索引扫描,然后返回空结果。

平时每秒几百个穿透请求,MySQL还能勉强应付,大促时每秒几千上万个穿透请求同时涌过来,数据库的连接池瞬间被占满,后面正常的读写请求全部排队等待,更麻烦的是,这些穿透请求往往带着相同的参数,比如同一个伪造的商品ID,数据库的查询缓存(如果还开着)也会被这些无效查询刷爆。

穿透请求的三个主要来源

  • 恶意攻击:攻击者故意构造不存在的Key,比如负数ID、超长字符串、随机UUID,专门绕过缓存打数据库
  • 业务Bug:前端传参没做校验,比如商品ID传了个空字符串或者格式错误的数值
  • 数据删除:某个商品下架后,缓存和数据库都删了,但用户收藏夹里还留着旧链接,点进来就是穿透

业内专家指出,大促期间穿透请求中有相当一部分来自自动化脚本,它们会循环遍历ID,从1试到几百万,专门找那些不存在的记录。

穿透和击穿、雪崩的本质区别

很多人把缓存穿透和缓存击穿搞混,其实它们完全不同:

类型 触发条件 影响范围 大促风险
穿透 查询不存在的数据 单个Key反复打库 恶意请求可无限放大
击穿 热点Key突然过期 单个热点Key打库 秒杀商品最容易触发
雪崩 大量Key同时过期 大面积缓存失效 缓存设置了相同过期时间

穿透最隐蔽的地方在于:它不需要等Key过期,也不需要热点Key,只要请求的Key不存在,就能一直穿透下去,大促期间系统日志里全是”查无此数据”的SQL记录,DBA看着数据库QPS飙升却找不到明显的热点,这就是穿透的典型特征。

缓存穿透和击穿区别在哪?大促排查别搞混

如何快速区分穿透和击穿

排查问题的时候,先看Redis的命中率曲线,如果是穿透,命中率会持续偏低,因为大量请求查的Key压根不存在,Redis根本无从命中,如果是击穿,命中率在某个时间点突然掉下去,过一会儿又恢复,因为热点Key过期后,第一个请求打库重建缓存,后续请求又命中Redis了。

再看数据库的SQL类型,穿透的SQL大多是SELECT xxx WHERE id = 不存在的值,而且这个值反复出现,击穿的SQL则是针对某一个特定ID的查询,比如秒杀商品的详情页。

行业共识认为,大促期间穿透和击穿经常同时发生,秒杀商品的热点Key过期导致击穿,与此同时攻击者还在用不存在的ID构造穿透,两者叠加会让数据库承受双倍压力。

大促排查穿透的实操路径

  • 查看Redis的keyspace_hits和keyspace_misses指标,如果misses占比超过较大比例,基本可以断定存在穿透
  • 打开MySQL慢查询日志,筛选出执行频率高但返回空结果的SQL
  • 用tcpdump抓包分析请求特征,看是否存在规律性的ID遍历
  • 检查应用日志中”缓存未命中”的Key分布,找出高频不存在的Key

缓存穿透解决方案对比:布隆过滤器、空值缓存、参数校验

参数校验最便宜的第一道防线

在业务入口做参数合法性校验,拦截掉明显不合法的请求,比如商品ID必须是正整数且小于某个阈值,用户ID必须是特定格式的UUID。

if (productId == null || productId <= 0 || productId > MAX_PRODUCT_ID) {
    return "参数错误";
}

这个方案能挡住大部分恶意攻击,但对”合法但不存在的ID”无能为力,比如商品ID 99999是合法的,但数据库里确实没有这个商品,请求照样穿透。

空值缓存简单直接但要注意细节

把不存在的Key也缓存起来,Value设为null或者一个特殊标记,TTL设置短一些,比如30到60秒。

Object value = redis.get(key);
if (value == null) {
    Object dbValue = db.query(key);
    if (dbValue == null) {
        redis.set(key, NULL_MARKER, 30); // 缓存空值30秒
    }
    return dbValue;
}

优点是实现简单,缺点有两个:一是大量不存在的Key会占用Redis内存,攻击者可以构造几百万个随机Key,把Redis内存塞满;二是TTL过期后,攻击者重新发起同样的请求,又会穿透一次,所以空值缓存适合业务场景中不存在Key数量有限的情况,不适合应对大规模恶意攻击。

布隆过滤器大促最推荐的方案

布隆过滤器是一个bit数组,用多个哈希函数把Key映射到bit位上,判断一个Key不存在时,一定不存在;判断存在时,可能有误判,这意味着它可以完美拦截穿透请求不存在的Key直接返回,根本不会打到数据库。

实操步骤:

  • 在应用启动时,把数据库里所有商品ID加载到布隆过滤器
  • 请求进来先查布隆过滤器,如果Key不存在,直接返回空结果
  • 如果Key存在,再查Redis,Redis没命中再查数据库
  • 新增商品时,同步把新ID加入布隆过滤器
// 使用Redisson的RBloomFilter
RBloomFilter<Long> bloomFilter = redisson.getBloomFilter("productBloom");
bloomFilter.tryInit(1000000L, 0.01); // 预期100万条数据,误判率1%

需要注意布隆过滤器不支持删除操作,商品下架后ID仍然留在过滤器里,但这不是问题最多是让这个Key走到Redis和数据库查一遍,然后发现不存在再缓存空值,不会造成穿透。

三种方案怎么选

方案 实现成本 内存占用 拦截效果 适用场景
参数校验 极低 无 拦截非法参数 所有系统必备
空值缓存 低 较高 拦截重复穿透 不存在Key有限
布隆过滤器 中 较低 拦截所有穿透 大促高并发场景

大促场景下,建议参数校验 + 布隆过滤器 + 空值缓存三层组合,参数校验挡掉明显非法的,布隆过滤器挡掉不存在的,空值缓存兜底处理布隆过滤器误判的那部分请求。

大促前如何验证防御效果

压测模拟穿透流量

写一个压测脚本,随机生成不存在的商品ID,模拟攻击者行为,观察数据库QPS是否稳定,Redis命中率是否正常,压测时重点关注数据库连接池使用率,如果超过80%,说明防御还不够。

监控关键指标

  • Redis的rejected_connections,连接被拒说明压力过大
  • MySQL的Threads_running,超过50说明有堆积
  • 慢查询数量,穿透会导致大量空查询变慢
  • 布隆过滤器的误判率,通过日志统计实际误判比例

应急预案

即使做了防御,也要准备Plan B,在网关层配置限流规则,针对同一个Key的请求频率做限制;开启降级开关,数据库压力过大时直接返回兜底数据,比如商品已下架的提示页面。

缓存穿透对大促数据库的隐性压力:常见问题解答

大促期间布隆过滤器误判的请求怎么处理?

误判意味着Key实际上不存在,但布隆过滤器说存在,这类请求会继续查Redis和数据库,最终返回空结果,处理方式是:在数据库查询层加一层空值缓存,把误判的Key缓存30秒,避免同一个误判Key反复查库,布隆过滤器误判率通常控制在1%以下,配合空值缓存完全够用。

缓存穿透和缓存雪崩在大促时哪个更危险?

穿透更危险,雪崩是大量Key同时过期,但Key本身是存在的,重建缓存只需要查一次数据库,后续请求又能命中Redis,穿透则不同,每次请求都是无效查询,数据库白白承受压力却不产生任何缓存收益,更关键的是,穿透可以被攻击者利用,用少量请求就能拖垮数据库,而雪崩往往是配置不当造成的偶发问题。

空值缓存的TTL设置多长时间合适?

建议设置在30秒到5分钟之间,TTL太短,比如10秒,攻击者频繁刷新就能绕过缓存继续穿透;TTL太长,比如1小时,大量不存在的Key堆积在Redis里,既浪费内存又可能导致Key淘汰掉正常数据,大促期间可以适当缩短到30秒,因为攻击流量大,宁可多查几次数据库也要控制内存占用。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/772498.html

赞 (0)
上一篇 2026年10月22日 08:20
下一篇 2026年10月22日 08:22

相关推荐

  • 最新ai大模型xl_2026年有哪些?2026年最强AI大模型排名

    2026年标志着人工智能技术从“可用”向“可信、可控、多模态融合”的全面跨越,这一年的大模型技术已彻底打破了单一文本交互的桎梏,实现了逻辑推理、自主规划与实体世界交互的质变,核心结论在于:AI不再是简单的辅助工具,而是成为了具备“认知闭环”的生产力主体,企业若不能在此时完成AI工作流的重构,将在效率竞争中面临降……

    2026年4月10日
    8300
  • 昆仑CDN是什么,昆仑CDN加速服务好用吗

    昆仑CDN凭借深度优化的全球节点布局与自研智能调度算法,在2026年已成为高并发、低延迟场景下的首选加速方案,其综合性能指标显著优于传统通用型CDN服务商,在数字化转型进入深水区后的2026年,网络体验已成为衡量企业竞争力的核心指标,随着4K/8K视频、云游戏及实时交互应用的普及,用户对首屏加载时间(FCP)和……

    2026年6月28日
    4300
  • 杭州大模型开发岗位好用吗?杭州大模型开发岗位待遇怎么样

    杭州大模型开发岗位在当前技术红利期表现优异,但需结合个人技术栈和职业规划综合评估,以下从核心结论、分层论证、解决方案三个维度展开分析:核心结论:岗位价值显著,但需匹配技术能力与行业需求杭州作为数字经济高地,大模型开发岗位平均薪资达35-60K/月(2024年猎聘数据),头部企业如阿里、蚂蚁集团提供算力支持与商业……

    2026年3月31日
    9400
  • Linux虚拟机中127.0.0.1无法访问怎么办?,本地回环地址不通故障排查技巧

    Linux虚拟机中127.0.0.1无法访问,绝大多数情况下是服务未启动、端口未监听、防火墙拦截或hosts解析异常,可按系统服务到网络配置的顺序逐层排查,先分清现象:是拒绝连接还是超时无响应排查前先做一个关键区分,这直接决定问题排查方向,在虚拟机终端执行:curl -v 127.0.0.1如果输出Connec……

    云计算 2026年10月18日
    100
  • 国内厂商云存储架构系统哪家好,怎么选?

    国内云存储架构已从早期的简单堆叠硬件,演变为集智能化、混合云部署、极致成本优化与高安全性于一体的综合生态系统,核心结论在于:现代国内厂商云存储构架系统通过“存算分离、多级分层、全闪存加速”的技术路线,成功解决了海量数据爆发带来的性能瓶颈与成本压力,并在数据主权与合规性上建立了绝对优势,成为企业数字化转型的坚实底……

    2026年2月23日
    16300
  • cdn用户下载为何失败?cdn加速服务怎么选择

    CDN用户下载的核心优势在于通过边缘节点就近分发,显著降低延迟并提升大文件传输成功率,是解决跨网访问卡顿和带宽成本过高的最佳技术路径,爆发的今天,无论是视频平台的高清流媒体,还是软件公司的安装包分发,用户对于“下载快、不中断”的期待已成为底线需求,传统的单源站架构在面对海量并发请求时,往往显得力不从心,导致首屏……

    2026年5月28日
    3800
  • 虚拟机模拟TCP时,如何确保网络性能与真实环境一致?,虚拟机网络延迟测试方法。

    想让虚拟机里的TCP性能贴近真实环境,核心不是猛调内核参数,而是把虚拟化I/O路径、CPU调度、中断与时钟、网络拓扑这四个变量压到与物理机同量级,再用可复现的基准测试做闭环校准,换句话说,虚拟机模拟TCP不是“开个增强型网卡就完事”,而是要让数据包从网卡到协议栈的每一跳都尽量少绕路、少排队、少抖动,虚拟机模拟T……

    2026年10月12日
    100
  • 网易蜂巢免备案cdn能用吗,网易蜂巢免备案cdn

    网易蜂巢免备案CDN是2026年国内非备案域名加速的最优解,它通过边缘节点缓存技术实现无需ICP备案即可加速访问,但需注意其合规性边界及特定场景下的性能表现,网易蜂巢免备案CDN的核心优势解析在2026年的互联网生态中,合规性与访问速度的平衡成为企业刚需,网易蜂巢作为网易旗下专业的CDN服务商,其“免备案”特性……

    2026年5月27日
    4100
  • 服务器CDN赚钱吗?CDN如何赚钱及服务器CDN收益详解

    2026 年通过服务器 CDN 赚钱的核心逻辑已从单纯的技术租赁转向“边缘计算 + 内容分发”的复合盈利模式,其本质是利用全球节点网络降低延迟并处理高并发流量,从而向企业收取流量费、计算服务费及安全防护费,年利润率在合规运营下可达 35%-45%,商业模式重构:从带宽售卖到价值增值2026 年的 CDN 市场已……

    2026年5月12日
    4700
  • 国内外人脸识别技术对比,差距有多大谁领先?

    当前,全球人脸识别技术已进入成熟期,中国与欧美国家在技术路线上呈现出显著的差异化优势,中国凭借海量数据积累和丰富的落地场景,在应用广度、算法工程化能力及复杂环境下的识别准确率上处于全球领先地位;而国外(特别是美国)则在基础理论研究、隐私保护算法、抗攻击性及底层硬件芯片上保持核心优势,国内外人脸识别技术对比显示……

    2026年2月18日
    24000

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注