一、什么是缓存穿透、雪崩、击穿
1.缓存穿透:
正常情况:后台从redis中查询到数据返回给前端,或者redis中查询不到数据,然后去db里查到数据,写入到缓存中。
异常情况:查询不存在的数据,因为DB里查询不到data,所以没法写入缓存,每次都会去db里查询。(例如查询id = 998的数据,每次都查询不到后每次查询都会redis和DB都走一次)
解决方案:
解决方案A:仍把空的返回结果存入redis {key:1, value:null}。但是这样做如果有大量数据都不存在,redis会存储大量空数据,消耗内存(这里可以进一步优化,可以设置一个过期时间),第二个缺点是如果原先的数据不存在,后来数据库中有插入了该条数据,可能存在数据不一致的问题。
解决方案B:接口校验,类似于用户权限校验,对于这种无效访问直接拦截,不允许请求到redis或者DB上
解决方案C:布隆过滤器
2.缓存雪崩
缓存雪崩是指在同一时间段大量的缓存key同时失效或者redis服务宕机,导致大量请求到达DB,带来巨大压力
大量的缓存key同时失效:将缓存失效时间分开来,在原有失效时间基础上随机增加一个值(1-5分钟)
redis服务宕机:a.利用redis服务集群提高服务的可用性,比如哨兵模式、集群模式b.给业务添加多级缓存,c.给缓存业务添加降级限流策略 d.使用锁或者队列模式,如果查不到就加上排它锁,请他请求只能进行等待。
3.缓存击穿
redis中的某个热点key过期,但是此时大量的用户访问该过期key。类似于某明星出轨上了热搜,这时候大量用户访问该热点时间,由于某种原因,热点数据的key过期了,这时候大量的高并发直接达到DB上,导致DB瘫痪。
解决方案:
a.提前对热点数据进行设置,类似于新闻等软件都需要对热点数据进行预先设置在redis中
b.监控数据,适时调整,监控哪些数据是热门数据,实时的调整key的过期时长
c.使用锁机制,只有一个请求获取到互斥锁后,然后将DB中数据查询并返回到redis中,之后所有请求就可以从redis中得到响应。