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

把苹果咬哭 把苹果咬哭     2022-12-01     743

关键词:

啥也不说了,面试高频问题。

一、缓存穿透

用户想要查询一个数据,发现redis内存数据库中没有,也就是说没有命中缓存,也是会向持久层数据库查询,发现也没有,那么本次查询失败。

如果此时,用户很多,高并发场景下都去查这个数据,由于缓存都没有命中,于是压力直接打到持久层数据库那里,这就是缓存穿透。

通常情况下:

  • 客户端请求需要查询数据,会先去缓存查询。
  • 若缓存存在数据,就直接返回。
  • 如果缓存不存在,则去mysql查询。

这种场景是比较常见的,比如大家熟知的秒杀,在同一时间点会集中并发请求过来,如果数据库被冲垮了,可能会造成不可预估的后果。

如何解决?

1. 布隆过滤器

这是一种数据结构,对所有可能查询的参数以hash形式存储。当查询过来的时候,先在过滤器里进行校验,若查不到数据直接丢弃,避免对底层存储系统的查询造成压力。

不过布隆过滤器之所以能做到在时间和空间上的效率比较高,是因为牺牲了判断的准确率,可能会存在误判,简而言之:

  • 当布隆过滤器说某个值存在时,这个值可能不存在
  • 当布隆过滤器说不存在时,那就肯定不存在

2. 缓存空对象

当持久层数据库也没查询到数据,即使返回的空对象也将其缓存起来,同时设置一个过期时间,之后再次查询这个数据就直接从缓存里取,只不过是空的,从而保护持久层数据库。

但是这种处理方法,也会带来一些问题:

  • 如果存在很多的空值的 key,那么这些key都会被缓存起来,耗费更多的空间。
  • 即使对空值设置了过期时间,仍然会存在,缓存层与持久层的数据会有一段时间窗口的不一致,这会对需要保持一致性的业务产生影响。

二、缓存击穿

缓存击穿,是指一个key非常热点,在不停的扛着高并发,如果这个key失效了,在失效的瞬间,持续的并发量就会穿破缓存,直接打到持久层数据库,就像一个防御墙被凿开一个洞。

注意这里跟缓存穿透的区别:

  • 缓存穿透是因为查不到导致
  • 缓存击穿是因为量太大,缓存过期

最出名还时微博热搜了,当某明星出轨,这个就成了热点key,最终请求通过这一个热点key,压力直接打到底层数据库。

如何解决?

1. 设置热点数据永不过期

从缓存层面来看,没有设置过期时间,所以不会出现缓存过期的问题。

2. 加互斥锁

使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程如果没有获得分布式锁的权限,就要等待。这种方式将高并发的压力转移到了分布式锁,所以对分布式锁
的考验非常大。

三、缓存雪崩

是指在某一个时间段,缓存集中过期失效,或者redis宕机了。

比如晚上12点有抢购活动,事先把这波商品集中的放到缓存里,假设设置过期时间1小时。那么等1点的时候,这批商品就缓存过期了,而新缓存还没设置进来。如果这时候对这些商品有大量的查询,就会直接落在持久层上。对持久层数据库而言,会产生周期性的压力波峰。

如果是缓存服务器挂了,那么就很糟糕了,很可能持久层数据库瞬间就被冲垮。

如何解决?

1. redis高可用

其实就是加机器,搭建redis集群,异地多活。

2. 限流降级

在缓存失效后,通过加锁或者队列来控制读取数据库写到缓存里的线程数量,比如上面提到的分布式锁。

3. 数据预热

在正式部署之前,先把可能被访问的数据预先访问一遍,这样一来,大量可能会被高频访问的数据会被加载到内存。

4. 设置不同过期时间

缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。

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

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

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

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

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

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

谈谈redis缓存击穿透和缓存击穿的区别,以及它们所引起的雪崩效应(代码片段)

面试经历在很长的一段时间里,我以为缓存击穿和缓存穿透是一个东西,直到最近去腾讯面试,面试官问我缓存击穿和穿透的区别;我回答它俩是一样的,面试官马上抬起头用他那细长的单眼皮眼睛瞪着我说&#... 查看详情

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从入门到进阶第6讲:缓存雪崩击穿穿透场景与解决方案(代码片段)

...的数据类型开始记录,直到一些更多的应用,如缓存击穿还有分布式锁以及Redis持久化等。希望大家有问题也可以一起沟通,欢迎一起学习,对于专栏内容有错还望您可以及时指点,非常感谢大家🌹。目录... 查看详情

缓存雪崩击穿穿透

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

面试必问题:缓存击穿缓存穿透缓存雪崩,你还傻傻分不清(代码片段)

...,并且对数据的实时性要求不高时,往往会接入缓存以达到快速Response、降低数据库压力的作用,常用来做缓存的中间件如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、主动更新五、缓存穿透解决方法:六、缓... 查看详情