当前位置: 首页 > news >正文

【Redis】线上并发三大灾难

目录

    • 一,缓存穿透
      • 1.是什么?
      • 2.怎么防止?
    • 二,缓存击穿
      • 1.是什么?
      • 2.怎么防止?
    • 三,缓存雪崩
      • 1.是什么?
      • 2.怎么防止?
    • 总结

一,缓存穿透

1.是什么?

其实很好理解,一般正常的逻辑是:前端发起查询,先查redis,redis命中就返回数据,如果没有就去查mysql,查到后写入redis里并返回。

现在假设有一个黑客想要搞垮这个网站。

它一直发送请求查询一个不存在的商品ID或者其它东西,他们既不存在于redis中,也不存在于mysql中。

这就造成了一个后果:请求砸向 Redis→ \rightarrow没命中→ \rightarrow请求全部穿透到 MySQL→ \rightarrowMySQL 查半天发现也没有→ \rightarrow无法回写 Redis(因为没数据)。

100 万个这种恶意请求直接绕过缓存防御,全部死磕在 MySQL 上。MySQL 瞬间 CPU 爆满、连接池耗尽,直接瘫痪,整个网站跟着一起崩溃。

2.怎么防止?

有两种方法:

  1. 当mysql发现一个ID不存在时,不要什么都不做。我们在redis里为这个ID存一个特殊的空值。并设置一个较短的过期时间。那么接下来这个较短的时间中,再用这个ID来攻击时,redis就会直接返回null,请求就被拦截在缓存层了(但是这个方案,只要黑客不断变换攻击ID,照样会穿透,这只能防止某个ID被大量请求的情况)。
  2. 这才是真正有效的:布隆过滤器,这是一个极其高效的二进制数据结构。在请求到达Redis之前,先让布隆过滤器在最外层站岗。我们把数据库里所有已存在的商品ID全部通过哈希算法映射到布隆过滤器上(他只占极小的内存)。当黑客带着 ID = -999 连进来时,布隆过滤器一算,冷冰冰地告诉你:“这个 ID 绝对不存在于数据库中!” 连 Redis 都不用查,直接当场拒绝该请求。

二,缓存击穿

1.是什么?

击穿和穿透不一样,穿透是查不存在的数据,击穿是查一个非常热门的真实数据。

如果一个数据在redis里的访问量是每秒20w次。这个key在被疯狂访问的时候,刚好到了它在redis里设置的过期时间(TTL)。

就在这一秒钟,这个Key突然在Redis里蒸发了,而那每秒20w次的请求瞬间扑了个空。

20w个并发请求在同一秒内发现Redis没数据,只能同时涌入到Mysql里去查这条数据,面对这么多的并发,服务器瞬间宕机。

2.怎么防止?

  1. 不设置过期时间。
    对于这种预知到的超热点数据(比如春晚活动、双十一 iPhone 秒杀页面),在后台直接不给它设置过期时间,让它永久留在内存里。等活动结束了,后台再手动执行脚本异步把它们删掉。
  2. 互斥锁(Mutex Lock)
    当 Redis 没命中时,不写命令让所有请求一拥而上。而是让第一个到达的请求去“抢一把互斥锁”(比如用 SETNX 抢锁)。
    抢到锁的那个幸运儿,代表大家去 MySQL 查数据,然后把数据写回 Redis。而剩下的 19.9 万个请求,抢不到锁就原地睡 50 毫秒然后重试。当它们醒来重试时,Redis 里已经有那个幸运儿写回的数据了,直接完美命中!

三,缓存雪崩

1.是什么?

如果说击穿是“精准爆破”打死一个点,那么雪崩就是“大面积塌方”,整座大山砸下来。

通常有两种原因会引发雪崩:

  • 原因 1: 运营人员做活动,在昨晚零点批量导入了 100 万个商品数据,并且顺手给它们设置了相同的过期时间(比如全是 1 小时)。结果到了今天凌晨 1 点,这 100 万个 Key 在同一秒钟集体过期。

  • 原因 2: Redis 服务器由于硬件故障、断电或者网线被踢掉,直接挂机(宕机)了。

  • 灾难: 整个系统的缓存屏障瞬间消失(空了)。海量的用户请求失去了 Redis 的保护,如同雪崩引发的洪水,全量砸在底层的 MySQL 数据库上。MySQL 哪怕再强,也会在一秒内被连环冲跨,导致整个公司的业务全部瘫痪。

2.怎么防止?

  1. 随机过期时间(Jitter)
    原理: 绝对不要让大批量的 Key 拥有相同的过期时间。我们在设置过期时间时,加上一个随机干扰值。
    做法: 比如原本要设 1 小时(3600秒),我们改成 3600 + rand(1, 300) 秒。这样,这 100 万个 Key 就会在 1 小时到 1 小时零 5 分钟之间慢慢地分批过期,请求被均匀拉长,MySQL 完全可以轻松撑住。

  2. 主从架构与哨兵集群
    原理: 单机版 Redis 太脆弱了。在线上必须部署 Redis 哨兵模式(Sentinel) 或者 Cluster 集群。
    效果: 一旦主机(Master)断电挂了,哨兵会像“急救队长”一样,在 10 秒内自动把备用机(Slave)提拔为新的主机,继续支撑流量,不让系统崩盘。


总结

穿透:查的是不存在的数据,黑客恶意乱搞。防御靠 布隆过滤器 或 缓存空对象。
击穿:查的是超热点的数据,刚好过期。防御靠 互斥锁(SETNX) 或 热点数据永不过期。
雪崩:成千上万的 Key 集体过期,或 Redis 直接宕机。防御靠 随机过期时间 和 高可用集群。

http://www.jsqmd.com/news/924874/

相关文章:

  • 基于APDS-9960与Arduino的智能篮球框:非接触式进球检测与声光反馈系统
  • 2026年实用降AI率工具:实测AI率从90%降至4%的靠谱方案 - 降AI小能手
  • 口碑好的永康软件开发企业 - 企业推荐官【官方】
  • 5步快速上手IguanaTex:免费LaTeX公式插入PowerPoint终极指南
  • 2026温州中央空调多联机维修|专业高效检修,首选满意家电维修 - 资讯纵览
  • 现在不升级Gemini邮件工作流,30天后将面临iOS 18邮件智能过滤降权(附紧急迁移路线图)
  • 茉莉花插件:3个核心功能彻底改变你的中文文献管理体验
  • 如何用res-downloader轻松保存微信视频号等平台内容:完整下载指南
  • 考试报名用的免费证件照制作入口有哪些?2026各类考试报名照片免费制作工具汇总 - 科技大爆炸
  • 如何高效实现Switch与Wii U跨平台存档转换:BotW-Save-Manager完全指南
  • 避坑指南:给GTX750/1050装CUDA,千万别踩‘DCH驱动’和‘PyTorch版本’这两个大坑
  • 苏州管道循环泵生产厂商排行榜 - 品牌推广大师
  • B站视频怎么下载2026全场景操作解析含合规方式与风险规避技巧
  • 2026 年 05 月博物馆通柜上门测量服务全流程技术细节与避坑指南 - 奔跑123
  • Arduino智能时钟:光敏传感器触发与舵机控制的交互装置制作
  • 保定家庭教育指导师报名入口在哪?授权机构中山优才教育说明 - 当下教育培训干货
  • 5步永久备份QQ空间:GetQzonehistory让青春回忆永不丢失
  • 基于Arduino与电感传感的智能减速带系统设计与实现
  • 资源编号298_疯狂动物城主题高德地图车机版9.1.0.600087正式版分支魔改
  • 2026劳力士售后升级公告:官方维修门店新址落地最新服务热线同步开通 - 资讯纵览
  • 视频号怎么保存到相册安卓苹果全机型通用高清保存操作详解
  • 终极指南:RevokeMsgPatcher如何实现Windows微信QQ消息防撤回与多开功能
  • 别再只关心快充瓦数了!手把手教你读懂USB PD协议里的Source、Sink和角色互换
  • 基于Arduino与状态机的智能抢答器系统:从硬件到软件的完整实现
  • 终极指南:用WeChatMsg永久保存你的微信聊天记录
  • OpCore-Simplify:黑苹果EFI自动化配置引擎的技术架构与实现原理
  • 2026年深圳财税公司选哪家?5家正规机构横向对比,不吹不黑,按需选择 - 小征每日分享
  • 别再只会用snmpwalk查交换机了!手把手教你用它监控Linux服务器性能(附CentOS 7/8安装命令)
  • 如何永久保存微信聊天记录?三步实现数据自由与智能分析
  • labelCloud:让3D点云标注变得简单的Python工具