文章目录

  • 缓存雪崩
    • 出现原因一
    • 解决方案
      • 方案一 差异化设置过期时间
      • 方案二 服务降级
      • 方案三 不设置过期时间
    • 出现原因二
    • 解决方案
      • 方案一 服务熔断
      • 方案二 请求限流
      • 方案三 Redis构建高可靠集群
  • 缓存击穿
    • 解决方案
      • 方案一 分布式锁
      • 方案二 热点数据不设置过期时间
  • 缓存穿透
    • 出现原因
    • 解决方案
      • 方案一 设置缺省值
      • 方案二 使用布隆过滤器过滤数据

缓存雪崩

大量的应用请求无法在Redis缓存中进行处理,紧接着应用将大量请求发送到数据库层,导致数据库层的压力激增

缓存雪崩一般有两个原因导致,解决方案也有所不同

出现原因一

缓存中有大量Key同时过期,导致大量请求无法得到处理,大量数据需要回源数据库

解决方案

方案一 差异化设置过期时间

差异化缓存过期时间,不要让大量的 Key 在同一时间过期。比如,在初始化缓存的时候,给这些数据的过期时间增加一个较小的随机数,这样一来不同数据的过期时间有所差别又差别不大,即避免了大量数据同时过期又能保证这些数据在相近的时间失效

方案二 服务降级

允许核心业务访问数据库,非核心业务直接返回预定义的信息

方案三 不设置过期时间

初始化缓存数据的时候设置缓存永不过期,然后启动一个后台线程 30 秒一次定时把所有数据更新到缓存,而且通过适当的休眠,控制从数据库更新数据的频率,降低数据库压力。

出现原因二

Redis实例发生故障宕机,无法处理请求,就会导致大量请求积压到数据库层

解决方案

方案一 服务熔断

暂停业务应用对缓存服务的访问,从而降低对数据库的压力

方案二 请求限流

控制每秒进入应用程序的请求数,避免过多的请求被发到数据库

方案三 Redis构建高可靠集群

通过主从节点的方式构建Redis高可靠集群。可以保证在Redis主节点故障宕机时,从节点切换到主节点,继续提供服务,避免由于缓存实例宕机导致缓存雪崩

缓存击穿

热点数据在某一时刻过期了,可能会导致随之而来的大量的并发请求直接打到数据库,导致数据库压力激增。

解决方案

方案一 分布式锁

采用锁机制控制打到数据库的请求,读取数据后将其写回到缓存,保证了其他线程可以命中缓存。

//伪代码
加锁成功;
result=redis.getKey(X);
if(result==null){result=db.getData(X);redis.setData(X,result);
}
释放锁;
方案二 热点数据不设置过期时间

缓存穿透

客户端 请求了一个业务程序中不存在的数据,即要访问的数据既不在Redis缓存中,也不在数据库中。导致每次类似的请求,都会先从Redis–>数据库去查数据,最终也无果。

当存在大量请求这样访问时,会同时给缓存和数据库带来很大压力。

出现原因

1、误操作导致:缓存中的数据和数据库中的数据都被误删了

2、恶意攻击:专门访问数据库中不存在的数据

解决方案

方案一 设置缺省值

比如当请求id=1000的用户数据时,在数据库中找不到该条数据,则将NONE这样具有特殊含义的字符串设置到缓存中,后续客户端再请求该数据时,可以直接命中缓存,不再访问数据库。

但是这样有个问题,如果客户端访问大量的不同的数据,那这些大量无效的数据可能会占满缓存

方案二 使用布隆过滤器过滤数据

布隆过滤器由一个初值都为 0 的 bit 数组和 N 个哈希函数组成,可以用来快速判断某个数据是否存在。

工作原理

1、使用 N 个哈希函数,分别计算这个数据的哈希值,得到 N 个哈希值

2、把这 N 个哈希值对 bit 数组的长度取模,得到每个哈希值在数组中的对应位置。

3、标记数据,把对应位置的 bit 位设置为 1

如果数据不存在,那布隆过滤器中bit数组对应的bit位的值为0.

过滤规则

当一个元素需要被检索时,使用N个哈希函数对该元素求得哈希值,并定位到bit数组中。如果发现对应位置处bit位有任何一个0,就说明这个元素不存在于布隆过滤器;当bit位都是1,说明这个元素可能存在于布隆过滤器(这里说可能,是因为不同元素经过哈希运算可能得到相同的哈希值)

像Guava、Redisson 都有布隆过滤器的实现。

我们只需要初始化布隆过滤器,即将数据添加到布隆过滤器中。然后借助布隆过滤器去判断元素是否存在

参考文献
Redis核心技术与实战

缓存雪崩 缓存击穿 缓存雪崩出现原因及解决方案相关推荐

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

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

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

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

  3. Redis中的缓存雪崩、击穿、穿透的原因以及解决办法

    缓存雪崩.击穿.穿透一旦发生,会导致大量的请求积压到数据库层.如果请求的并发量很大,就会导致数据库宕机或是故障,这就是很严重的生产事故了. 俗话说,知己知彼,百战不殆.了解了问题的成因,我们就能够在应 ...

  4. 缓存穿透、击穿、雪崩什么的傻傻分不清楚?看了这篇文后,我明白了

    对于缓存,大家肯定都不陌生,不管是前端还是服务端开发,缓存几乎都是必不可少的优化方式之一.在实际生产环境中,缓存的使用规范也是一直备受重视的,如果使用的不好,很容易就遇到缓存击穿.雪崩等严重异常情景, ...

  5. 缓存穿透、击穿、雪崩

    一.缓存穿透 缓存穿透是指缓存和数据库中均不存在目标数据,而用户不断发起请求,缓存也得不到更新,由此每次请求该数据都会到数据库.高并发量,就会对后端的 DB 系统造成很大压力.如查询 id 为&quo ...

  6. Redis缓存穿透、击穿、雪崩、概念及解决办法

    在生产环境中,会因为很多的原因造成访问请求绕过了缓存,都需要访问数据库持久层,虽然对Redsi缓存服务器不会造成影响,但是数据库的负载就会增大,使缓存的作用降低 一.缓存穿透 1.缓存穿透理解   缓 ...

  7. 什么是缓存穿透,击穿,雪崩,怎么解决?

    缓存穿透:指在高并发场景下,如果某一个 key 被高并发访问,没有被命中,出于对容错性考虑,会尝试去从后端数据库中获取,从而导致了大量请求到达数据库,而当该 key 对应的数据库本身就是空的情况下,这 ...

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

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

  9. Redis缓存穿透、击穿、雪崩面试题详解

    缓存穿透 问题: 指的是客户端请求的数据在缓存中找不到,数据库中也没有存储,客户端还不断的发起请求.这样每次都无法在数据库查询到,缓存中永远没有这个数据. ​ 这样的话,客户端一直去访问,会给后端数据 ...

  10. 5 Redis缓存穿透、击穿、雪崩、分布式锁、布隆过滤器

    1 Redis 应用问题解决 1.1 缓存穿透 1.1.1 问题描述 key 对应的数据在数据源并不存在,每次针对此 key 的请求从缓存获取不到,请求都会压到数据源(数据库),从而可能压垮数据源.比 ...

最新文章

  1. Tensorflow tf.layers
  2. FM之RKD_WORD_WRAP
  3. ubuntu搭建zookeeper集群
  4. 深入理解Java:注解
  5. 问题:循环元素,被选中元素个数,全选
  6. 实践单元测试(2) - 大话单元测试
  7. electron forge 好用吗_在优麒麟上使用 Electron 开发桌面应用
  8. SQLite学习和使用
  9. win10 安装低版本的 .net framework
  10. js调整数组某些元素到指定位置顺序_如何在JS数组特定索引处指定位置插入元素?...
  11. 收到客户反馈的BUG,主管应该怎么办
  12. OAuth 2 开发人员指南(Spring security oauth2)
  13. 通过双击运行linux脚本
  14. 谷歌支付服务端服务账号订单校验
  15. 【BZOJ】2078: [POI2004]WYS
  16. 项目质量监测(三)e2e test端到端测试——单元测试和端到端测试 e2e test工具-Cypress Nightwatch TeatCafe Codecov-测试结果可视化
  17. 2022新版千月影视双端APP带H5功能开源程序支持当面付和易支付
  18. 墨尔本计算机读研申请条件,墨尔本大学计算机硕士申请条件
  19. 学会IDEA REST Client后,postman就可以丢掉了...
  20. 不允许使用抽象类类型的对象怎么办_什么是抽象类?

热门文章

  1. java调用自己写的类型_Java基础——自定义类的使用
  2. ArcGIS教程:将支持页面插入地图册
  3. Pbootcms网站防黑、防跨站的经验分享
  4. 系统架构概念及思想1
  5. [C++](16)多态:虚函数,使用,多态的原理
  6. 伪随机码(verilog)
  7. 2014重庆邮电大学/重邮考研/计算机最全复试资料/c语言程序设计,重庆邮电大学计算机学院复试经验...
  8. 负折射率波导matlab,第二章-理想平板介质光波导中的光传播特性及仿真-终版.pdf...
  9. 1500ml等于多少l_正常人的血糖标准是多少?如何判断自己患上了糖尿病
  10. 徒有虚名的黄页,分类,垂直类网站评测 我对114.com.cn的分析[原创]