redis缓存雪崩缓存穿透缓存击穿

m0_67401660 m0_67401660     2022-10-22     653

关键词:

Redis缓存雪崩、缓存穿透、缓存击穿

Redis缓存过程

Redis数据库是一个nosql数据库,存储的数据格式是key-value。Redis数据库运行在内存中,因此他的查询速度比MySql快的多。所以我们会把一些用户经常查询的数据放在Redis中,当Redis有的时候就直接返回,当Redis中没有的时候再去数据库中查找。以此增加服务的运行效率。

缓存雪崩

Redis中的缓存数据是有过期时间的,当在同一时间大量的缓存同时失效时就会造成缓存雪崩
比如说,在11点的时候大家都去饿了么点外卖,这个时候饿了么的Redis中就存了一大批商家的信息,并且饿了么的程序员给这个缓存设置的过期时间是6个小时。那么到下午5点晚饭时间又是一大波人来饿了么点外卖,这个时候Redis的缓存刚刚好集体过期了,短时间内大量的查询请求就全部落到了脆弱的MySql上,导致MySql直接爆炸!

解决方案

要解决Redis的缓存雪崩就需要避免Redis的缓存在短时间内大量的过期

永不过期

设置Redis中的key永不过期,但是这样会占用很多服务器的内存。

合理的设置过期时间

根据业务需要来合理的设置过期的时间。但是架不住有一些突发的情况。

使用Redis的分布式锁

既然一瞬间大量请求落到MySql上会导致MySql爆炸!那么就加一点限制,让一时间只有一个相同请求落到MySql上,反正都是查询同一个信息,之后的其他请求就可以去Redis中找了。

缓存穿透

Redis缓存穿透指的是,在Redis缓存和数据库中都找不到相关的数据。也就是说这是个非法的查询,客户端发出了大量非法的查询 比如id是负的 ,导致每次这个查询都需要去Redis和数据库中查询。导致MySql直接爆炸!

解决方案

过滤非法查询

在后台服务中过滤非法查询,直接不让他落到Redis服务上。比如id<=0或者分页内容过大的

缓存空对象

如果他的查询数据是合法的,但是确实Redis和MySql中都没有,那么我们就在Redis中储存一个空对象,这样下次客户端继续查询的时候就能在Redis中返回了。但是,如果客户端一直发送这种恶意查询,就会导致Redis中有很多这种空对象,浪费很多空间

布隆过滤器

布隆过滤器由一个二进制数组和k个哈希数组组成。

布隆过滤器的新增

当我们想新增一个元素时(例如新增python),布隆过滤器就会使用hash函数计算出几个索引值,然后将二进制数组中对应的位置修改为1。

布隆过滤器的查询

当我们想查询一个元素时(例如查询python),布隆过滤器就会使用hash函数计算出几个索引值,然后查询二进制数组中的对应位置是否都为1。如果都为1就说明改元素存在。但是布隆过滤器存在误判的可能性,因为不同的元素hash后的值可能是一样的,例如我们查询java,java经过hash计算出来的索引值和python的一模一样,那么就会认为java也在布隆过滤器中。

布隆过滤器的删除

同上,布隆过滤器删除就是把hash后数组对应的位置改成0.但是存在误删的可能。按照上面的例子删除python就会同时把java给删掉。

布隆过滤器解决缓存穿透

我们首先把MySql中的数据存到布隆过滤器中(由于使用二进制数组,也就是位图所以空间使用很少),之后如果Redis缓存中没有命中,就需要查询MySql数据库前先在布隆过滤器中查询是否在MySql有数据。

布隆过滤器的特点

  1. 存在误判的可能性
  2. 如果数据存在,那么一定返回true
  3. 查询的时间复杂度是O(k),k为hash函数个数
  4. k越大,数组长度越大,误判的可能性越低
  5. 使用位图(二进制数组)所以内存压力较小

缓存击穿

缓存击穿和缓存雪崩类似,也是因为Redis中key过期导致的。只不过缓存击穿是某一个热点的key过期导致的。当有一个热点数据突然过期时,就会导致突然有大量的情况直接落到MySql上,导致MySql直接爆炸!

解决方案

主要是两个思路,

  1. 让那个热点的key不要突然过期
  2. 不要让大量的请求落到MySql上。

设置热点Key永不过期

简单粗暴,我都不过期了,你就不可能绕开我去访问MySql。但是可能会对Redis内存造成巨大的压力,所以一般会设置一个较长的时间。

使用Redis的分布式锁

既然一瞬间大量请求落到MySql上会导致MySql爆炸!那么就加一点限制,让一时间只有一个相同请求落到MySql上,反正都是查询同一个信息,之后的其他请求就可以去Redis中找了。

redis12_缓存雪崩缓存穿透基于布隆过滤器解决缓存穿透的问题缓存击穿基于缓存击穿工作实际案例(代码片段)

文章目录①.缓存雪崩②.缓存穿透③.在centos7下布隆过滤器2种安装方式④.缓存击穿⑤.高并发的淘宝聚划算案例落地①.缓存雪崩①.问题的产生:缓存雪崩是指缓存数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至... 查看详情

redis08_缓存雪崩缓存穿透基于布隆过滤器解决缓存穿透的问题缓存击穿基于缓存击穿工作实际案例(代码片段)

文章目录①.缓存雪崩②.缓存穿透③.在centos7下布隆过滤器2种安装方式④.缓存击穿⑤.高并发的淘宝聚划算案例落地①.缓存雪崩①.问题的产生:缓存雪崩是指缓存数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至... 查看详情

redis的缓存穿透缓存雪崩缓存击穿问题的概念与解决办法(代码片段)

详细介绍了Redis的缓存穿透、缓存雪崩、缓存击穿等问题的概念与解决办法。文章目录1缓存穿透1.1什么是缓存穿透?1.2怎么解决1.3BloomFilter布隆过滤器1.3.1BloomFilter的原理1.3.2BloomFilter的优缺点1.3.3GuavaBloomFilter1.3.4RedisBloomFilter2... 查看详情

redis——缓存穿透缓存击穿缓存雪崩分布式锁(代码片段)

文章目录:1.缓存穿透1.1什么是缓存穿透?1.2缓存穿透的解决方案2.缓存击穿2.1什么是缓存击穿?2.2缓存击穿的解决方啊3.缓存雪崩3.1什么是缓存雪崩?3.2缓存雪崩的解决方案4.分布式锁4.1使用setnx+del实现分布式... 查看详情

redis——缓存穿透缓存击穿缓存雪崩分布式锁(代码片段)

文章目录:1.缓存穿透1.1什么是缓存穿透?1.2缓存穿透的解决方案2.缓存击穿2.1什么是缓存击穿?2.2缓存击穿的解决方啊3.缓存雪崩3.1什么是缓存雪崩?3.2缓存雪崩的解决方案4.分布式锁4.1使用setnx+del实现分布式... 查看详情

redis的缓存问题之缓存穿透缓存雪崩缓存击穿(代码片段)

目录一、什么是缓存穿透?二、常见的解决方案有两种:1、缓存空对象2、布隆过滤综上所述三、编码解决商品查询的缓存穿透问题四、缓存雪崩问题及解决思路1、什么是缓存雪崩?五、缓存击穿问题及解决思路 1、... 查看详情

redis缓存穿透缓存击穿缓存雪崩的原理和解决办法(代码片段)

Redis缓存穿透、缓存击穿、缓存雪崩的原理和解决办法1.前言2.缓存穿透的解决办法3.缓存击穿解决办法4.缓存雪崩的解决办法1.前言在大数据时代,由于网络请求的并发,导致的数据库I/O开销巨大,所以为了缓解数据库的压力,缓... 查看详情

redis缓存穿透缓存击穿缓存雪崩的原理和解决办法(代码片段)

Redis缓存穿透、缓存击穿、缓存雪崩的原理和解决办法1.前言2.缓存穿透的解决办法3.缓存击穿解决办法4.缓存雪崩的解决办法1.前言在大数据时代,由于网络请求的并发,导致的数据库I/O开销巨大,所以为了缓解数据库的压力,缓... 查看详情

redis缓存雪崩缓存击穿缓存穿透原因,解决方案?(代码片段)

缓存雪崩、缓存击穿、缓存穿透原因,解决方案?缓存雪崩由于设置缓存时,key都采用了相同expire,导致缓存在某刻同时失效,请求全部直到DB,DB瞬时负载过重而雪崩解决方案在原有失效时间基础上增加一个随机值,比如1~5分钟... 查看详情

缓存雪崩击穿穿透

   缓存雪崩:   为了保证缓存中的数据与数据库中的数据一致性,会给Redis里的数据设置过期时间,当缓存数据过期后,用户访问的数据如果不在缓存里,业务系统需要重新生成缓存,因此就会访问数据库... 查看详情

redis缓存穿透缓存击穿缓存雪崩(面试必备)

啥也不说了,面试高频问题。一、缓存穿透用户想要查询一个数据,发现redis内存数据库中没有,也就是说没有命中缓存,也是会向持久层数据库查询,发现也没有,那么本次查询失败。如果此时,用户很多,高并发场景下都去... 查看详情

redis之缓存穿透击穿雪崩问题与缓存删除淘汰策略(代码片段)

一、缓存问题与解决缓存穿透缓存穿透是指查询缓存和DB中都不存在的数据。缓存穿透示例:publicStationfindProjectStation(LongstationId)//从缓存中查询Stationstation=(Station)redisTemplate.boundHashOps("project_station").get(stationId);if(station==null)// 查看详情

redis之缓存穿透击穿雪崩问题与缓存删除淘汰策略(代码片段)

一、缓存问题与解决缓存穿透缓存穿透是指查询缓存和DB中都不存在的数据。缓存穿透示例:publicStationfindProjectStation(LongstationId)//从缓存中查询Stationstation=(Station)redisTemplate.boundHashOps("project_station").get(stationId);if(station==null)// 查看详情

redis缓存雪崩,缓存穿透,缓存击穿详解

用户请求的缓存正常流程图 上图是一个正常的简单的缓存流程!!!土豆用户去访问某宝,某宝请求redis看看缓存中有没有土豆用户请求的数据,如果redis中有该数据的缓存,则直接返回数据展示出来供应... 查看详情

redis缓存穿透击穿雪崩到底是个啥?7张图告诉你(代码片段)

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

redis缓存击穿(失效)缓存穿透缓存雪崩怎么解决?

...ff0c;QPS=10000左右,读写平均耗时10~100ms。用Redis作为缓存系统正好可以弥补DB的不足,「码哥」在自己的MacBookPro2019上执 查看详情

redis学习笔记26——缓存异常:如何解决缓存雪崩击穿穿透问题?

缓存雪崩缓存雪崩是指大量的应用请求无法在Redis缓存中进行处理,紧接着,应用将大量请求发送到数据库层,导致数据库层的压力激增。缓存雪崩一般有两个原因导致:1、缓存中有大量数据同时过期解决方法... 查看详情

redis学习笔记26——缓存异常:如何解决缓存雪崩击穿穿透问题?

缓存雪崩缓存雪崩是指大量的应用请求无法在Redis缓存中进行处理,紧接着,应用将大量请求发送到数据库层,导致数据库层的压力激增。缓存雪崩一般有两个原因导致:1、缓存中有大量数据同时过期解决方法... 查看详情