什么是缓存穿透、缓存击穿、缓存雪崩?如何预防?

什么是缓存穿透、缓存击穿、缓存雪崩?如何预防?

 

一、什么是缓存穿透,如何预防?

缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,请求直接打在了数据库上。 

 

 

举个例子:

对于系统A,假设一秒 5000 个请求,结果其中 4000 个请求是黑客发出的恶意攻击。
黑客发出的那 4000 个攻击,缓存中查不到,因此就要去数据库里查4000次,并且也查不到。

数据库 id 是从 1 开始的,然而黑客发过来的请求 id 全部都是负数。这样的话,缓存中不会有,请求每次都会直接越过缓存,直接查询数据库。这种恶意攻击场景的缓存穿透就会直接把数据库给打死。
大概就是这个样子:

什么是缓存穿透、缓存击穿、缓存雪崩?如何预防?_第1张图片

解决方案:有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。另外也有一个更为简单粗暴的方法(我们采用的就是这种),如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

 

 

二、什么是缓存击穿,如何预防?

缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

解决方案:缓存击穿的话,设置热点数据永远不过期。或者加上互斥锁就能搞定了。

 

二、什么是缓存雪崩,如何预防?

缓存雪崩,是指在某一个时间段,缓存集中过期失效。

雪崩其实也可以做到提前预防,那就是用到过期时间的key,时间全部错开,此外,有些数据可以做永久保存的话那就直接保存好了,这样就不会造成大面积的key失效了。

1.永不过期

比如某些热点数据可以设置永不过期。

2.过期时间错开

处理缓存雪崩简单,在批量往Redis存数据的时候,把每个Key的失效时间都加个随机值就好了,这样可以保证数据不会在同一时间大面积失效。

如果Redis是集群部署,将热点数据均匀分布在不同的Redis库中也能避免全部失效的问题。

setRedis(Key,value,time + Math.random() * 10000)

3.多缓存结合

Redis结合ehcache或者memcached,先查redis再查memcached。

 

 

你可能感兴趣的:(面试,Redis,缓存,面试,缓存)