缓存问题 - 缓存雪崩 缓存穿透 缓存击穿

在面试中,redis常被问到的问题可能就是缓存问题了,今天就简单的为大家介绍一下Redis的雪崩、穿透、击穿三个问题的原因、用案例解释造成的原因以及解决办法。


一、缓存处理流程

前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。
在这里插入图片描述


二、缓存雪崩

1. 缓存雪崩的原因及案例

概念:缓存雪崩是指缓存不可用或者大量缓存由于超时时间相同在同一时间段失效,大量请求直接访问数据库,数据库压力过大导致系统雪崩。
目前电商首页以及热点数据都会去做缓存,一般缓存都是定时任务去刷新,或者是查不到之后去更新的,定时任务刷新就存在这个问题。

案例:如果所有首页的Key失效时间都是12小时,中午12点刷新的,我零点有个秒杀活动大量用户涌入,假设当时每秒10000个请求,本来缓存能抗住每秒5000个请求,但是缓存当时所有Key都失效了,此时1秒10000个请求全部落在数据库上,数据库可能没来得及报警,DBA都还没有反应就直接挂掉了。而如果没有及时处理,DBA直接重启了数据库,马上又被新的请求给挂掉了,这就是缓存雪崩。
在这里插入图片描述

2.解决方案
  1. 给缓存加上一定区间内的随机生效时间,不同的key设置不同的失效时间,避免同一时间集体失效。比如以前是设置10分钟的超时时间,那每个Key都可以随机8-13分钟过期,尽量让不同Key的过期时间不同
  2. 采用多级缓存,不同级别缓存设置的超时时间不同,及时某个级别缓存都过期,也有其他级别缓存兜底
  3. 利用加锁或者队列方式避免过多请求同时对服务器进行读写操作

三、缓存穿透

1.缓存穿透的原因及案例

概念:缓存只是为了缓解数据库压力而添加的一层保护层,当从缓存中查询不到我们需要的数据就要去数据库中查询了。
如果被黑客利用,频繁去访问缓存中没有的数据,那么缓存就失去了存在的意义,瞬间所有请求的压力都落在了数据库上,这样会导致数据库连接异常。

案例:一般数据库id都是大于0的,假设我一直用0以下的参数去请求你的页面,每次都能绕开你的Redis直接打到你的数据库,数据库也查不到,并发高点就容易崩掉。

2.解决方案
  1. 约定:对于返回为NULL的依然缓存,对于抛出异常的返回不进行缓存,注意不要把抛异常的也给缓存了。采用这种手段的会增加我们缓存的维护成本,需要在插入缓存的时候删除这个空缓存,当然我们可以通过设置较短的超时时间来解决这个问题。
    在这里插入图片描述

  2. 制定一些规则过滤一些不可能存在的数据,小数据用BitMap,大数据可以用布隆过滤器,比如你的订单ID 明显是在一个范围1-1000,如果不是1-1000之内的数据那其实可以直接给过滤掉。
    在这里插入图片描述


四、缓存击穿

1.缓存击穿的原因及案例

概念:缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
缓存击穿与缓存雪崩相像,但我理解的区别是,雪崩是崩盘了,而击穿是因为某个热点数据击穿了缓存(一般你是缓存失效),打击到了数据库导致数据宕机。(击穿的案例和雪崩相像,不写)

2.解决方案
  1. 设计热点数据永远不过期。
  2. 加互斥锁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值