正常网络请求如下:
雪崩
定义:大量缓存在同一时间失效,请求全部落在数据库,导致数据库挂了
事例:淘宝首页N多热点数据设置的缓存过期时间是同一个时间点,当高峰期的时候涌入一大批请求,这个时候缓存过期了,则这一大批量请求落在数据库
解决方案:
1、设置不同的过期时间,如随机过期时间
2、设置redis集群,热点数据分布在不同的服务器节点上
3、定时job去更新缓存
4、不设置缓存过期时间 (基本Pass,缓存很占内存)
穿透
定义:一直访问一个缓存和数据库都不存在的数据,导致数据库奔溃
事例:数据库 id 是从 1 开始的,结果黑客发过来的请求 id 全部都是负数。这样的话,缓存中不会有,请求每次都“视缓存于无物”,直接查询数据库。
解决方案:
1、无论mysql是否有值,都设置缓存
2、参数合法性验证
3、使用布隆过滤器
4、异常ip直接拉黑
5、限制每秒网站最高访问量
击穿
定义:某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况,当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库
案列: 双十一秒杀一双鞋,缓存突然过期了,来抢购的请求均落在数据库
解决方案:
1、将热点数据设置为永远不过期
2、使用redis互拆锁,等待第一个请求构建完缓存之后,再释放锁