java面试题之缓存的穿透、击穿、雪崩、预热

缓存的穿透、击穿、雪崩、预热

1、什么是缓存穿透:

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

缓存穿透就是请求直接从缓存中穿透到数据库了,数据库里也没这个数据,数据库就也一起凉凉了。

2、问题分析:

缓存穿透的关键在于在Redis中查不到key值,假如有恶意攻击者传进大量的不存在的key,那么大量的请求打在数据库上是很致命的问题,所以在日常开发中要对参数做好校验,一些非法的参数,不可能存在的key就直接返回错误提示。

3、解决方法:

(1)将无效的key存放进Redis中:

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

(2)使用过滤器:

于是我们就在缓存之前再加一个过滤器,将数据库中所有key值都存储在过滤器中,在查询Redis前先去过滤器查询 key 是否存在,如果不存在就直接返回,不让其访问数据库,从而避免了对底层存储系统的查询压力。

1、什么是缓存击穿:

缓存击穿是某个热点的key值失效,大并发集中对其进行请求,就会造成大量请求读缓存没读到数据,从而导致高并发访问数据库,引起数据库压力剧增。

缓存击穿就是单个key值没了,但是它是热点,redis这个盾没防住,大量针对一个key的请求像剑一样刺向数据库。

2、问题分析:

关键在于某个热点的key失效了,导致大并发集中打在数据库上。

3、解决方案:

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

(2)如果业务允许的话,对于热点的key可以设置为永不过期的key 。

1、什么是缓存雪崩:

缓存雪崩就是缓存在同一个时刻出现大规模的key失效,那么就会导致大量的请求打在了数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。

缓存雪崩就是大量key没了,请求像雪崩一样打到数据库

2、问题分析:

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

3、解决方案:

(1)设置不同的过期时间,避免相同的过期时间导致缓存雪崩,造成大量数据库的访问。

如果真的发生了缓存雪崩,还有兜底的措施:

(2)使用熔断机制。当流量到达一定的值时,就直接给用户返回提示,防止过多的请求打在数据库上。至少能保证一部分用户是可以正常使用,其他用户多刷新几次也能得到结果。

(3)提高数据库的容灾能力,可以使用分库分表,读写分离的策略。

(4)为了防止Redis宕机导致缓存雪崩的问题,可以搭建Redis集群,提高Redis的容灾性。

1、什么是缓存预热:

缓存预热就是系统启动前,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,让用户直接查询事先被预热的缓存数据。

2、问题分析:

对于高并发的流量,没有预热,那Redis初始数据为空,就都会访问到数据库中, 对数据库造成流量的压力。

3、缓存预热解决方案:

(1)数据量不大时,工程启动的时候进行加载缓存动作。

(2)数据量大时,设置一个定时任务脚本,进行缓存的刷新。

(3)数据量很大时,优先保证热点数据进行提前加载到缓存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值