redis缓存穿透和雪崩
指的是一个非常热的key 一直有非常大流量的并发访问,当缓存中key失效过期的瞬间,所有的访问量瞬间击破缓存,所有请求瞬间全部访问到数据库,
例: 微博某个热搜,刘畊宏直播,
大量的访问量直接访问到后端数据库 同时数据库还要会写到缓存,导致数据库压力很大甚至崩溃。
决方案:
1.热key缓存永不过期 ,防止缓存过期打到数据库
2.分布式锁:一个线程获取,其他线程等待,防止后端数据库崩溃
当用户访问一个数据 缓存中没有,缓存没命中,所以向持久层数据库查询
也没有 本次查询失败,但是当大量没用命中访问量都去访问数据库持久层的时候,数据库压力很大 缓存也就失效了 相当于缓存穿透。
例:秒杀活动,双十一 618购物街,短时内大量点击率抢购数量有限的商品,会出现大量查询失败,
解决办法:
1.布隆过滤器 、
2.存储空对象:数据库没找到后,redis中临时存一个空对象(空对象多了也会占用内存)
缓存中的key都是有失效时间的 ,缓存雪崩指的是 某个时间点,缓存集体失效,redis缓存失去了作用。
第二种情况是 缓存服务器down机 自然形成了雪崩的情况。
例: 双十一商品 都是提前加载到缓存,到凌晨开始抢购的时候,缓存都过期了了当雪崩的时候没有一片雪花是无辜的,每个key失效都不是问题,但是所有key集体失效,会造成所有的访问直接打到了持久层数据库,数据库访问调用暴增。
解决方案:
1.redis高可用:多设置几台redis
2.限流降级:缓存失效后,通过加锁或者队列来控制读数据库写缓存的数量
3.数据预热:大量数据加载到缓存中,根据不同访问量来设置不同过期时间,防止大面积集体过期