缓存雪崩
什么是缓存雪崩
当某一时刻发生大规模的缓存失效问题,比如缓存服务宕机了
例子:
如果一个首页的key失效时间都是12小时,中午12点刷新。但是零点有个秒杀活动导致大量用户涌入,假设每秒10000个请求,本来缓存可以抗住每秒5000请求,但是缓存当时所有key都失效了,此时每秒10000个请求都会落在数据库上,数据库扛不住,DBA没反应过来直接挂了。此时,如果没有什么特别的方案来处理故障,DBA着急,重启数据库,但是数据库又被新的流量给打死了。
解决办法:
- 在往redis存数据的时候,把每个key的失效时间都加个随机值,保证数据不会在同一时间大面积失效
- 设置热点数据永不过期,采用定时任务对快要失效的缓存进行更新缓存和失效时间
- 采用集群,降低服务宕机的概率
缓存穿透
什么是缓存穿透
用户不断的去请求一条缓存和数据库中都没有的数据
例子:
我们数据库id都是从1开始自增的,如果发起一条id为-1的数据或者id大的不存在的数据,这时的用户可能是攻击者,攻击会导致数据库压力增大,严重会压垮数据库
解决办法:
从缓存取不到的数据,在数据库中也没有取到,这是可以先将对应key的Value写为null,未知错误,稍后重试这样的值【具体值可问产品】,缓存有效时间可以设置短点,如30秒,防止正常情况也无法使用
缓存击穿
什么是缓存击穿
在高并发的情况下,大量请求同时查询同一个key时,此时这个key正好失效,就会导致同一时间,这些请求都会去查询数据库。
解决办法:
- 采用锁,只有拿到锁的第一个线程去请求数据库,然后插入缓存。每次拿到锁的时候都会查询一下缓存有没有
- 设置热点数据永不过期