一、概述

① 缓存穿透:大量请求根本不存在的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中得到响应

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

  1. Redis应用问题解决(缓存穿透、击穿、雪崩、分布式锁)

    Redis应用问题解决(缓存穿透.击穿.雪崩.分布式锁) 缓存穿透 问题描述 当系统中引入redis缓存后,一个请求进来后,会先从redis缓存中查询,缓存有就直接返回,缓存中没有就去db中查询,db ...

  2. 缓存穿透 雪崩 击穿

    缓存穿透 雪崩 击穿 缓存穿透: 大量访问redis不存在的key上,造成数据库压力大,这就是缓存穿透. 缓存雪崩: redis在某一个时间点,大量的key失效,造成访问这些key的指令访问数据库,给 ...

  3. Redis缓存穿透、击穿、雪崩、预热、更新、降级

    Redis是高性能的分布式内存数据库,对于内存数据库经常会出现下面几种情况,也经常会出现在Redis面试题中:缓存穿透.缓存击穿.缓存雪崩.缓存预热.缓存更新.缓存降级.本篇分别介绍这些概念以及对应的 ...

  4. Redis基本数据类型、持久化机制、集群模式、淘汰策略、缓存穿透、击穿、雪崩、常见面试题大集合!

    redis redis reids的常用数据类型 1.String 2.Hash 3.List 5.Sorted Set(ZSet) 6.其他 发布(pub)订阅模式(sub)模式 作用 Redis的 ...

  5. Redis 缓存穿透、击穿、雪崩现象及解决方案

    前言 如何有效的理解并且区分 Reids 穿透.击穿和雪崩 缓存穿透 关键词:穿过 Redis 和数据库 当 Redis 和数据库中都没有我们想要的数据时,就需要考虑缓存穿透的问题了.下面这段逻辑大家 ...

  6. Redis 缓存穿透、击穿、雪崩 解决方法

    目录 引言 一.缓存穿透 1. 缓存穿透的原理 2. 解决方法 2.1 布隆过滤器 2.2 缓存空对象 二.缓存击穿 1. 缓存击穿原理 2. 解决方法 2.1 设置热点数据永不过期 2.2 加互斥锁 ...

  7. 图解Redis缓存穿透、击穿、雪崩(必须知道)

    目录 一.缓存是什么? 二.缓存的作用和成本 1.缓存的作用: 2.缓存的成本: 三.缓存作用模型 1.根据id查询数据缓存流程 四.缓存更新策略 1.内存淘汰 2.超时剔除 3.主动更新 五.缓存穿 ...

  8. redis 穿透 雪崩 击穿

    redis 穿透 雪崩 击穿 穿透 击穿 雪崩 穿透 什么是穿透? key对应的数据在缓存中不存在,针对key的请求在缓存中获取不到,请求会到数据库中.缓存没有起到作用,像是被击穿了一样. 如果有恶意 ...

  9. 【Redis笔记】缓存穿透与缓存击穿以及应对方法

    [Redis笔记]缓存穿透与缓存击穿以及应对方法 一.缓存穿透 1. 缓存穿透概念 2. 缓存穿透解决方法 示例代码 二.缓存击穿 1. 缓存击穿概念 2. 缓存击穿解决方法 方法一:互斥锁 示例代码 ...

最新文章

  1. 2021操作系统知识结构图
  2. hash算法_一致性hash算法简介
  3. 如何不停机迁移一个mysql INNODB 数据库?
  4. 原来流行也可以变成怀旧!
  5. Linux安装python-3.8
  6. cm是什么域名_CM域名
  7. 后台OData model data查看工具
  8. node.js 获取异步方法里面的数据 =》 两种方式
  9. 信息安全工程师考试大纲
  10. AI向程序员老司机学习:从眼神的变化中寻找bug
  11. viper4android最新,ViPER4Android FX音效驱动下载-ViPER4Android音效驱动 v2.4.0.1 正式版_手机乐园...
  12. MongoDB实战-面向文档的数据(找到最合适的数据建模方式)
  13. IT痴汉的工作现状31-跳槽小贴士
  14. mysql 免安装版 启动_Windows下配置启动免安装版本mysql
  15. 解决VirtualBox虚拟电脑控制台严重错误
  16. 获取HTML页面的所有图片地址
  17. 比光刻机还重要的IP核是什么?
  18. 如何获取目标基因的转录因子
  19. 【问链财经-区块链基础知识系列】 第四十四课 邮储银行:U链福费廷业务系统
  20. 什么是异常,如何进行异常处理?

热门文章

  1. 生活细语:送给每一个热爱生活的人[ 收集整理,超强!!!]
  2. 送书 |《Python数据分析从小白到专家》
  3. Git分支管理规范和解析
  4. Vega Prime 常见问题集
  5. 0823 - 如何走出状态低谷?
  6.  Meltdown论文翻译【转】
  7. python中查看相对路径_python提取相对路径
  8. sublime教程html5,SublimeText开发html网站教程(一)
  9. 怎么将图片在线转成PDF
  10. js 各省市地名数据(包含各省市区域代码)(未测试)