什么是缓存穿透?什么是缓存雪崩?什么是缓存击穿?也聊一聊它们解决方案

(1)什么是缓存穿透?缓存穿透的流程是什么?有什么解决方案

缓存穿透:是指用户请求的数据在缓存中不存在,即没有命中,同时在数据库中也不存在,导致用户每次请求该数据都要去数据库中查询一遍。如果有恶意攻击者不断请求系统中不存在的数据,会导致短时间大量请求落在数据库上,造成数据库压力过大,甚至导致数据库承受不住而宕机崩溃。

解决方案

将无效的key存放进Redis中:当出现Redis查不到数据,数据库也查不到数据的情况,我们就把这个key保存到Redis中,设置value="null",并设置其过期时间很短,后面再出现查询这个key的请求的时候,直接返回null,就不需要再查询数据库了。但这种处理方式是有问题的,假如传进来的这个不存在的Key值每次都是随机的,那存进Redis也没有意义。

使用布隆过滤器:如果布隆过滤器判定某个 key 不存在布隆过滤器中,那么就一定不存在,如果判定某个 key 存在,那么很大可能是存在(存在一定的误判率)。于是我们可以在缓存之前再加一个布隆过滤器,将数据库中的所有key都存储在布隆过滤器中,在查询Redis前先去布隆过滤器查询 key 是否存在,如果不存在就直接返回,不让其访问缓存和数据库,从而避免了对底层存储系统的查询压力。

应用场景:针对一些恶意攻击,带过来的大量的随机的key,优先使用第二种方案,直接过滤掉。而对于少量的重复率比较高的key,则采用第一种方式进行缓存。

(2)什么是缓存雪崩?有什么解决方案

缓存雪崩:如果缓存在某一个时刻出现大规模的key失效,那么就会导致大量的请求打在了数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。这时候如果运维马上又重启数据库,马上又会有新的流量把数据库打死。这就是缓存雪崩。

造成缓存雪崩的关键在于同一时间的大规模的key失效,主要有两种可能:第一种是Redis宕机,第二种可能就是采用了相同的过期时间。

解决方案

1、事前

均匀过期:设置不同的过期时间,让缓存失效的时间尽量均匀,避免相同的过期时间导致缓存雪崩,造成大量数据库的访问。如把每个Key的失效时间都加个随机值,保证数据不会在同一时间大面积失效。

分级缓存:第一级缓存失效的基础上,访问二级缓存,每一级缓存的失效时间都不同。

热点数据缓存永远不过期:永不过期实际包含两层意思:①物理不过期,针对热点key不设置过期时间。②逻辑不过期,把过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存key的构建(因为热点数据可能会更新)。

保证Redis缓存的高可用:可以使用主从+哨兵,Redis集群来避免 Redis 全盘崩溃的情况。 防止Redis宕机导致缓存雪崩的问题。

2、事中

互斥锁:在缓存失效后,通过互斥锁或者队列来控制读数据、写缓存的线程数量,比如某个key只允许一个线程查询数据、写缓存,其它线程等待。这种方式会阻塞其它的线程,此时系统的吞吐量会下降。

使用熔断机制:限流降级。当流量达到一定的阈值,直接返回“系统拥挤”之类的提示,防止过多的请求打在数据库上将数据库击垮,至少能保证一部分用户是可以正常使用,其它用户多刷新几次也能得到结果。

3、事后

开启Redis持久化机制,尽快恢复缓存数据,一旦重启,就能从磁盘上自动加载数据,恢复内存中的数据。

(3)什么是缓存击穿?有什么解决方案

缓存击穿:跟缓存雪崩有点类似,缓存雪崩是大规模的key失效,而缓存击穿是某个热点的key失效,大并发集中对其进行请求,就会造成大量请求读缓存没读到数据,从而导致高并发访问数据库,引起数据库压力剧增。这种现象就叫做缓存击穿。(从两个方面解决,第一是否可以考虑热点key不设置过期时间,第二是否可以考虑降低打在数据库上的请求数量。)

解决方案

互斥锁:在缓存失效后,通过互斥锁或者队列来控制读数据、写缓存的线程数量,比如某个key只允许一个线程查询数据、写缓存,其它线程等待。这种方式会阻塞其它的线程,此时系统的吞吐量会下降。

热点数据缓存永远不过期:永不过期实际包含两层意思:①物理不过期,针对热点key不设置过期时间。②逻辑不过期,把过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存key的构建(因为热点数据可能会更新)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值