Redis中的缓存穿透、雪崩、击穿的原因以及解决方案(详解)

 一、概述

① 缓存穿透:大量请求根本不存在的key(下文详解)

② 缓存雪崩:redis中大量key集体过期(下文详解)

③ 缓存击穿:redis中一个热点key过期(大量用户访问该热点key,但是热点key过期)

穿透解决方案:

  • 对空值进行缓存
  • 设置白名单
  • 使用布隆过滤器
  • 网警

雪崩解决方案:

  • 进行预先的热门词汇的设置,进行key时长的调整
  • 实时调整,监控哪些数据是热门数据,实时的调整key的过期时长
  • 使用锁机制

击穿解决方案:

  • 进行预先的热门词汇的设置,进行key时长的调整
  • 实时调整,监控哪些数据是热门数据,实时的调整key的过期时长
  • 使用锁机制(只有一个线程可以进行热点数据的重构)

下文进行详解

三者出现的根本原因:Redis命中率下降,请求直接打在DB上

        正常情况下,大量的资源请求都会被redis响应,在redis得不到响应的小部分请求才会去请求DB,这样DB的压力是非常小的,是可以正常工作的(如下图)

        如果大量的请求在redis上得不到响应,那么就会导致这些请求会直接去访问DB,导致DB的压力瞬间变大而卡死或者宕机。如下图:

① 大量的高并发的请求打在redis上

② 这些请求发现redis上并没有需要请求的资源,redis命中率降低

③ 因此这些大量的高并发请求转向DB(数据库服务器)请求对应的资源

④ DB压力瞬间增大,直接将DB打垮,进而引发一系列“灾害”

 

        那么为什么redis会没有需要访问的数据呢?通过分析大致可以总结为三种情况,也就对应着redis的雪崩、穿透和击穿(下文开始进行详解) 

问题名称缓存穿透缓存击穿缓存雪崩
资源是否存在DB数据库服务器中×
资源是否存在Redis中××

×

redis没有对应资源的原因根本不存在该资源(DB也没有)某个热点key过期大部分key集体过期
根本原因

大量的高并发的请求打在Redis上,但是发现Redis中并没有请求的数据,redis的命令率降低,所以这些请求就只能直接打在DB(数据库服务器)上,在大量的高并发的请求下就会导致DB直接卡死、宕机


二、情景分析 (详解)

缓存穿透

缓存穿透产生的原因:请求根本不存在的资源(DB本身就不存在,Redis更是不存在)

举例(情景在线):客户端发送大量的不可响应的请求(如下图)

        当大量的客户端发出类似于:http://localhost:8080/user/19833?id=-3872 的请求,就可能导致出现缓存穿透的情况。因为数据库DB中本身就没有id=-3872的用户的数据,所以Redis也没有对应的数据,那么这些请求在redis就得不到响应,就会直接打在DB上,导致DB压力过大而卡死情景在线或宕机。

        缓存穿透很有可能是黑客攻击所为,黑客通过发送大量的高并发的无法响应的请求给服务器,由于请求的资源根本就不存在,DB就很容易被打垮了。

解决方式:

  • 对空值进行缓存:

        类似于上面的例子,虽然数据库中没有id=-3872的用户的数据,但是在redis中对他进行缓存(key=-3872,value=null),这样当请求到达redis的时候就会直接返回一个null的值给客户端,避免了大量无法访问的数据直接打在DB上

  • 实时监控:

        对redis进行实时监控,当发现redis中的命中率下降的时候进行原因的排查,配合运维人员对访问对象和访问数据进行分析查询,从而进行黑名单的设置限制服务(拒绝黑客攻击)

  • 使用布隆过滤器

        使用BitMap作为布隆过滤器,将目前所有可以访问到的资源通过简单的映射关系放入到布隆过滤器中(哈希计算),当一个请求来临的时候先进行布隆过滤器的判断,如果有那么才进行放行,否则就直接拦截

  • 接口校验

        类似于用户权限的拦截,对于id=-3872这些无效访问就直接拦截,不允许这些请求到达Redis、DB上。

注意事项:

  1. 使用空值作为缓存的时候,key设置的过期时间不能太长,防止占用太多redis资源
  2. 对空值缓存是一种被动的防御方式,当遇到黑客暴力请求很多不存在的数据就需要写入大量的null值到Redis中,可能导致Redis内存占用不足的情况
  3. 使用布隆过滤器,可以在用户访问的时候判断该资源是否存在,不存在则直接拒绝访问
  4. 布隆过滤器是有一定的误差,所以一般需要配合一些接口流量的限制(规定用户在一段时间内访问的频率)、权限校验、黑名单等来解决缓存穿透的问题

缓存雪崩

缓存雪崩产生的原因:redis中大量的key集体过期

举例:

        当redis中的大量key集体过期,可以理解为redis中的大部分数据都被清空了(失效了),那么这时候如果有大量并发的请求来到,那么redis就无法进行有效的响应(命中率急剧下降),请求就都打到DB上了,到时DB直接崩溃

解决方式:

  • 将失效时间分散开
通过使用自动生成随机数使得key的过期时间是随机的,防止集体过期
  •  使用多级架构
使用nginx缓存+redis缓存+其他缓存,不同层使用不同的缓存,可靠性更强
  • 设置缓存标记
记录缓存数据是否过期,如果过期会触发通知另外的线程在后台去跟新实际的key
  • 使用锁或者队列的方式
如果查不到就加上排它锁,其他请求只能进行等待

缓存击穿

产生缓存雪崩的原因:redis中的某个热点key过期,但是此时有大量的用户访问该过期key

举例:

        类似于“某男明星塌房事件”上了热搜,这时候大量的“粉丝”都在访问该热点事件,但是可能优于某种原因,redis的这个热点key过期了,那么这时候大量高并发对于该key的请求就得不到redis的响应,那么就会将请求直接打在DB服务器上,导致整个DB瘫痪。

解决方案:

  • 提前对热点数据进行设置
类似于新闻、某博等软件都需要对热点数据进行预先设置在redis中
  • 监控数据,适时调整
监控哪些数据是热门数据,实时的调整key的过期时长
  • 使用锁机制
只有一个请求可以获取到互斥锁,然后到DB中将数据查询并返回到Redis,之后所有请求就可以从Redis中得到响应


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

很多内容网站里出现的 RSS订阅 的起源,作用,使用方式与底层原理探究,以及如何让自己的网站支持RSS订阅探讨

前言 在逛很多内容社区的时候,经常发现rss订阅这一选项,平时没有怎么理会,因为这与我无关,但是遇见多了不免产生很多好奇,这次专门来探究一下它。 作用 RSS订阅(Really Simple Syndication或Rich Site Su…

C++ 11/14/17 智能指针

1. 简介 为了更加容易(更加安全)的使用动态内存,引入了智能指针的概念。智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。 标准库提供的两种智能指针的区别在于管理底层指针的方法不同:shared_p…

C++进阶(十一)C++11

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、C11简介二、统一的列表初始化1、{}初始化2、std::initializer_lis…

微信支付服务商,商户快速进件,减少工作量

大家好,我是小悟 服务商拓展特约商户,人工录入大量商户资料,耗时耗力。商户对标准费率不满意,无法说服商户先签约再帮其调整费率。 为了减少服务商工作量,服务商快速进件工具来了,分为移动端和管理端。用好…

【Leetcode】292. Nim 游戏

文章目录 题目思路代码结果 题目 题目链接 你和你的朋友,两个人一起玩 Nim 游戏: 桌子上有一堆石头。你们轮流进行自己的回合, 你作为先手 。每一回合,轮到的人拿掉 1 - 3 块石头。拿掉最后一块石头的人就是获胜者。 假设你们每…

maven 继承

文章目录 前言一、dependencyManagement一、dependencies传递规则二、引用顺序统一声明三、maven插件默认行为声明四、动态server.name 前言 系统整理一下用到的maven继承关系 一、dependencyManagement 版本控制 <properties><!--jar版本定义 --><spring-bo…

网络编程-序列化和反序列化/应用层协议/

预备知识 理解为什么要应用层协议&#xff1f; 在学过套接字编程后&#xff0c;我们对协议的理解更深了一步&#xff0c;协议也就是一种约定&#xff0c;也可以通俗理解为一种口头约定&#xff0c;对于通信双方来说是必须要遵守的。TCP和UDP协议它们是传输层控制协议&#xf…

聚焦网络安全公司,看F5如何应对企业数字化挑战

应用无处不在的当下&#xff0c;从传统应用到现代应用再到边缘、多云、多中心的安全防护&#xff0c;安全已成为企业数字化转型中的首要挑战。有专家指出&#xff0c;目前网络安全市场已经是仅次于计算、存储、网络的第四大IT基础设施市场。那什么网络安全公司应该具有哪些能力…

Magnet AXIOM取证神器的安装使用方法及详细教程

Magnet AXIOM取证神器的安装使用方法及详细教程 公众号&#xff1a;鱼影安全1.Magnet AXIOM取证工具介绍&#xff1a;2.Magnet AXIOM取证工具安装&#xff1a;第一步&#xff1a;第二步&#xff1a; 3.Magnet AXIOM取证工具使用方法&#xff1a; 公众号&#xff1a;鱼影安全 关…

用8086汇编语言写新春祝福

本篇目录 一、前言 1.创作背景 2.最终效果 3.必要的准备 二、实现步骤 1.程序框架 2.使程序暂停一段时间的子程序 3.显示一朵烟花的子程序 &#xff08;1&#xff09;参数 &#xff08;2&#xff09;地址转换 &#xff08;3&#xff09;显示花柄 &#xff08;4&#xff09;清除…

日本承认Omotenashi任务失败

日本在征服月球的尝试失败后承认失败 25.11.2022 日本已经取消了成为第四个登上月球的国家的申请。作为阿尔忒弥斯一号任务的一部分&#xff0c;日本宇宙航空研究开发机构&#xff08;JAXA&#xff09;将其Omotenashi CubeSat与NASA的SLS火箭和猎户座飞船一起送上了月球。但在…

人生,总要读几本好书!

以前&#xff0c;没有重视过读书的重要性 但是自从进入老马的陪伴群之后&#xff0c;听了老马的一路成长经历&#xff0c;才发现&#xff0c;所谓的一鸣惊人&#xff0c;都是厚积薄发的表现 大佬们在出人头地之前&#xff0c;都是有过很长一段时间的自我提升的 这个提升的方…

【数据库】创建索引的注意事项

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;数据库 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 结语 我的其他博客 前言 在数据库设计和优化中&#xff0c;索引的合理使用是提高查询性能和加速数据检索的关键因素之一。通过选…

浅析现代计算机启动流程

文章目录 前言启动流程概述磁盘分区格式MBR磁盘GPT磁盘隐藏分区 传统BIOS引导传统BIOS启动流程 UEFI引导UEFI引导程序UEFI启动流程 引导加载程序启动操作系统相关参考 前言 现代计算机的启动是一个漫长的流程&#xff0c;这个流程中会涉及到各种硬件的配置与交互&#xff0c;包…

《C程序设计》上机实验报告(六)之函数及其应用

实验内容&#xff1a; 1.运行程序 #include <stdio.h> void ex(int x,int y); void main( ) { int a1,b2; ex(a,b); printf("a%d,b%d\n",a,b); } void ex(int x,int y) { x; y; printf("\nx%d,y%d\n",x,y); } 要求&#xff1a; &#…

202418读书笔记|《成功的聪明人太多了,我必须为笨蛋争一口气》——做精致有趣的你呀

202418读书笔记|《成功的聪明人太多了&#xff0c;我必须为笨蛋争一口气》——做精致有趣的你呀 《成功的聪明人太多了&#xff0c;我必须为笨蛋争口气》书单狗一如既往的搞笑&#xff0c;幽默&#xff0c;博学。狗生哲学&#xff1a;做精致有趣的你呀。 趁着付费会员卡的劲儿&…

数据结构——框架简介

1.数据结构的作用 数据结构是计算机科学中一种重要的概念&#xff0c;它主要用于组织和存储数据以便有效地进行操作。数据结构可以看作是数据的组织方式&#xff0c;通过合理的数据结构设计&#xff0c;可以更高效地执行各种操作&#xff0c;提高程序的性能和可维护性。 以下是…

PyTorch 2.2 中文官方教程(十九)

使用 RPC 进行分布式管道并行 原文&#xff1a;pytorch.org/tutorials/intermediate/dist_pipeline_parallel_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 作者&#xff1a;Shen Li 注意 在github中查看并编辑本教程。 先决条件&#xff1a; PyTorc…

【Jenkins】pipeline基本使用

目录 一、pipeline 二、创建pipeline项目 1、安装pipeline插件 2、创建pipeline项目 三、pipeline语法 1、pipeline组成 2、agent&#xff1a;指定流水线的执行位置&#xff0c;流水线中每个阶段都必须在某个地方执行 3、stage&#xff1a;阶段&#xff0c;代表流水线的…

2024 高级前端面试题之 框架通识 「精选篇」

该内容主要整理关于 框架通识 的相关面试题&#xff0c;其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 框架通识精选篇 1. MVVM2. 路由原理3. Virtual Dom3.1 为什么需要 Virtual Dom3.2 Virtual Dom 算法简述3.2 Virtual Dom 算法实现 4. Diff算法4.1 React-Di…