一、缓存雪崩
定义:缓存雪崩是存储在缓存里的大量数据,在同一时刻全部过期,导致所有流量到达了数据库,导致数据库压力增加造成数据库服务端崩溃的现象
具体原因&解决方案:
- 缓存中间件宕机:如redis挂了,可对缓存中间件做高可用集群来避免
- 缓存大部分key设置了相同的过期时间:导致同一时刻大量key过期,可设置过期时间时尽量加上1~5分钟的随机值(使ttl更分散)
二、缓存穿透
定义:缓存穿透是指短时间内大量不存在的key请求到应用里面,而由于这些key在缓存里不存在,从而全部穿透到了数据库,造成数据库压力
解决方案:
- 把无效的key也保存到redis里面:设置一个特殊值,比如null,代表这个key数据库也不存在,就不会再去查数据库了
- 布隆过滤器:如果key比较固定,可以在启动的时候加载到布隆过滤器里,然后攻击者用不存在的key来请求的时候,先去布隆过滤器里查询,如不存在,则说明数据库里也不存在
- 优点:布隆过滤器用bitmap存储,占用空间小,虽然增加了复杂度
三、如果发生了缓存雪崩,数据库会怎样?
- 数据库的从、双主、读写分离会很好缓解这些并发流量
- 数据库有最大连接数的限制,超过限制的请求会被拒绝,再结合熔断机制能很好保护数据库,最多也是造成部分用户体验不好
四、Q&A
1、缓存击穿是什么?和缓存穿透有什么区别?
缓存击穿指的是数据库存在但缓存不存在的数据,出现的情况可能是缓存还没建立、或者是缓存已经过期。
缓存击穿的解决方案有:
- 如果是热点key可以采用提前预热和适当延长过期时间
- 同步数据库数据时加锁,保证同时只有一个请求去同步缓存,减少数据库压力
缓存击穿和缓存穿透有什么区别?:缓存击穿是数据库存在但缓存不存在,而缓存穿透是数据库和缓存都不存在(重点在于一个透字)。