专栏首页Jimoer来说说缓存穿透、缓存击穿、缓存雪崩都是什么?怎么解决?

来说说缓存穿透、缓存击穿、缓存雪崩都是什么?怎么解决?

前言

看到题目就知道了,这又是我在面试中遇到的,最近面试,把我的博文质量感觉都提上来了。面一次试感觉够我总结一周的,但还是每次都能遇到知识盲点,那以后就当面试总结是个扫盲的过程吧。

缓存穿透

面试的时候就被问到了这个问题,具体描述就是,正常的请求都是先请求到缓存(就当我们的缓存是Redis吧),如果缓存中存在数据,就直接返回,如果缓存中不存在请求的数据,就查询数据库,然后将查询到的数据再放到缓存中。

那么如果现在有一堆的请求,在缓存中没有,数据库中也没有,怎么办?这种垃圾请求还特别多,而且因为是在数据库没有查询到,所以也不会被放到缓存中,这就是缓存穿透的场景。

大量的这种请求,最终会导致数据库压力剧增,最终就会将数据打垮,若是这个数据库是核心数据库,那么其他所有依赖这个库的接口都会报错。

例如,每次请求的参数都是id,而id是我们数据库里的自增主键,但是请求过来的参数要么是-1这种,要么就是特别大的一个数,反正就是不存在的数据。

解决缓存穿透

那么如何解决缓存穿透呢?

  • 首先最基本的就是要做参数校验,非法的参数就直接return,连缓存层都到不了。
  • 当请求的数据在穿过Redis后,数据库也返回空,这样的数据也可以存入到缓存中,然后过期时间可以设置一个比较短的时间,这样能够在一定程度上保障后端数据库的安全。
  • 可以使用Redis的布隆过滤器,这个工具可以有效的防止缓存穿透的发生,我们可以将一个参数是否存在保存为一个boolean值,然后需要一个bit就可以存储,这样的数据压缩到一个数据结构中,就是布隆过滤器的原理。即节省存储空间,又能达到效果。

缓存击穿

我们在Redis存储的数据,主要是缓存的效果,目的是为了解决DB的压力,所以一些热点数据,都是先从缓存中获取的,当缓存中不存在的时候再从DB中获取然后再存入缓存。

但是如果一个高频的热点数据,在失效的一瞬间,它的大量请求就会直接打到DB上,这样在DB还没有返回数据给Redis的时候,DB承受了热点请求的压力,就好像缓存是一个水桶,然后突然水桶破了一个洞,直接冲垮了后面的堤坝(DB)。

解决缓存击穿

造成缓存击穿的原因是,在同一时刻从数据库中获取了大量数据,并且设置了相同的过期时间,这些缓存就会在同一时刻失效,这样就造成了缓存击穿的问题。 解决方案

  • 一些热点的数据,我们可以设置永不过期;或者是在访问数据的时候延长过期时间
  • 也可以用分布式锁,来锁住数据,保证同一时间只有一个线程能够获取数据,其他请求获取不到数据,只能等待,但是在高并发的场景下,这种方案,体验不太好,并且分布式锁的压力也会特别大

缓存雪崩

Redis中存储了很多的数据,但是有时候这些数据会出现,在同一个时刻批量过期的情况,因为有可能这些数据是批量插入的,所以他们的过期时间就会都在同一个时间。

正好在这个批量数据过期的时间点,大量的请求过来了,因为缓存数据过期了,所以没有命中缓存,直接请求到了数据库中。数据库的压力突然剧增,甚至有可能直接撑不住挂掉。然后有可能DBA会紧急重启DB,但是刚一恢复,新的请求立马又把DB打垮了。

也有可能就是Redis挂了,缓存都不能用了,请求也是直接打到了DB上,然后DB也是扛不住压力,直接挂掉。再恢复,再挂掉。

Redis中同一时刻大量的Key过期,那一瞬间和Redis不存在一样,还有Redis真的挂了的情况,这对服务和DB来说是灾难性的问题。

解决缓存雪崩

解决方案

  • 批量存入缓存的数据,我们可以为这些数据分别配置比较合理的过期时间,即使是随机分配过期时间也可以,避免同一时间失效。
  • 热点数据永不过期,更新操作时直接更新缓存,但是并不设置过期时间。
  • 当数据库缓存出问题时,可以采用降级措施,虽然是用DB顶上了请求,但是可以通过降级方案,保证某些数据在同一时刻只能有一个线程在查询数据库和写缓存,这样不至于把数据库给搞崩了。
  • 还有就是为了防止Redis挂了,导致的缓存雪崩,可以保证Redis的高可用,就是将Redis集群部署,然后将热点数据都分配到不同的节点上,这样就可以有效的防止雪崩的出现。

当说到Redis高可用的时候,面试有可能会继续问,怎么保证Redis在高可用的情况下,也就是集群中的数据同步时,而数据不会丢失等情况。 这个我准备下一篇来继续啃。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 缓存穿透、缓存击穿、缓存雪崩概念及解决方案缓存穿透缓存雪崩缓存击穿

    缓存穿透 概念 访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉。 解决方案 采用布隆过滤器,使用一个足够大的bitmap,用于存储可...

    Clive
  • 什么是缓存击穿、雪崩、穿透

    随着互联网的越来越普及,用户越来越多,系统性能瓶颈成了越来越热门的话题。要解决性能问题的技术手段有很多,比如:缓存、CDN加速、页面静态化、集...

    苏三说技术
  • 白话文讲述什么是缓存穿透、缓存雪崩、缓存击穿?

    在我们日常开发中,我们存储数据的方式一般都在数据库中,一般业务系统不会存在高并发的情况,也不怎么可能会发生概率性BUG问题,可一旦发涉及了高并发的需求,例如现在...

    黎明大大
  • 缓存雪崩,缓存穿透,缓存预热,缓存热备都是什么鬼?

    缓存雪崩,缓存穿透,缓存预热,缓存热备是在做缓存设计或者缓存应用时经常遇到的概念,也是缓存应用过程中必须熟知及知道 的东西。 缓存雪崩 当缓存处于单点情况下,一...

    Java技术栈
  • 缓存穿透,缓存击穿,缓存雪崩解决方案分析

    设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。

    java思维导图
  • 缓存穿透,缓存击穿,缓存雪崩解决方案分析

    设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。

    哲洛不闹
  • Redis缓存穿透、缓存雪崩和缓存击穿理解

    缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询...

    爱撸猫的杰
  • 什么是Redis缓存穿透、缓存雪崩和缓存预热

    原理:缓存穿透(击穿)是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据...

    会呼吸的Coder
  • Redis详解(十二)------ 缓存穿透、缓存击穿、缓存雪崩

    本篇博客我们来介绍Redis使用过程中需要注意的三种问题:缓存穿透、缓存击穿、缓存雪崩。

    IT可乐
  • 漫话:如何给女朋友解释什么是缓存穿透、缓存击穿、缓存雪崩?

    周末在家面试,和候选人聊到Redis的问题,于是问了他一个问题:你知道缓存穿透、缓存击穿和缓存雪崩吗?他们之间的区别是什么?分别怎么解决吗?

    CSDN技术头条
  • 缓存穿透、缓存击穿、缓存雪崩区别和解决方案【php】

    缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,这时的用户很可能是攻击者,攻击会导致数据库压力过大。

    sinnoo
  • 缓存穿透,缓存击穿,缓存雪崩的内容和解决方案

    每次想到缓存的概念时就会想到下面这张结构图,缓存主要解决的是中央处理器与内存之间速度不匹配出来的问题。

    码农王同学
  • 常见的缓存穿透,缓存击穿,缓存雪崩解决方案分析

    Tanyboye
  • 缓存雪崩,缓存穿透,缓存击穿出现的原因及解决方案?

    假设有如下一个系统,高峰期请求为5000次/秒,4000次走了缓存,只有1000次落到了数据库上,数据库每秒1000的并发是一个正常的指标,完全可以正常工作,但...

    Java识堂
  • 如何设计缓存系统:缓存穿透,缓存击穿,缓存雪崩解决方案分析

    来源:blog.csdn.net/zeb_perfect/article/details/54135506

    后端码匠
  • 缓存穿透、击穿、雪崩什么的傻傻分不清楚?

    对于缓存,大家肯定都不陌生,不管是前端还是服务端开发,缓存几乎都是必不可少的优化方式之一。在实际生产环境中,缓存的使用规范也是一直备受重视的,如果使用的不好,很...

    Java3y
  • 【实战问题】-- 缓存穿透,缓存击穿和缓存雪崩的区别以及解决方案

    平时我们使用缓存的方案,一般是在数据库中存储一份,在缓存中同步存储一份。当请求过来的视乎,可以先从缓存中取数据,如果有数据,直接返回缓存中的结果。如果缓存中没有...

    秦怀杂货店
  • 一篇读懂什么是缓存穿透击穿雪崩,分布式锁

    来源 | https://juejin.cn/post/69...

    麦洛
  • Redis系统学习之缓存穿透,缓存击穿,缓存雪崩的概念及其解决方案

    彼岸舞

扫码关注云+社区

领取腾讯云代金券