程序员Java

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

2020-12-10  本文已影响0人  该用户已秃头

作 者:纪莫

原文链接:https://www.cnblogs.com/jimoer/p/13677132.html

前言

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

缓存穿透

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

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

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

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

解决缓存穿透

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

缓存击穿

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

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

解决缓存击穿

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

缓存雪崩

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

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

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

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

解决缓存雪崩

解决方案

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

上一篇下一篇

猜你喜欢

热点阅读