缓存雪崩(大面积风险)
-
基本概念:大量请求无法在redis中处理,最终都转发到数据库层,导致数据库压力激增
-
导致出现雪崩的原因
- 缓存中大量数据同时过期
- redis实例发生故障宕机
-
缓存中大量数据同时过期的解决方案\
-
首先避免给大量数据相同的过期时间,随机增加一些过期时间(随机增加1~3min)
-
其次可以采用服务降级
- 针对非核心数据,暂停从缓存中查询数据
- 核心数据,查询缓存,缓存缺失就读数据库
-
-
redis实例发生故障宕机的解决方案\
-
redis实例一般可以支持数万请求的吞吐量,数据库支持千级别的请求吞吐量
-
首先可以在业务系统中实现服务熔断或者请求限流(事后处理)
-
熔断是防止引发连锁的数据库雪崩,最终导致整个系统崩溃 直接返回静态数据,避免产生更坏的影响
- 需要时刻监控负载指标 每秒请求数、CPU 利用率、内存利用率
-
限流是指业务系统的请求入口前端控制每秒进入系统的请求数,避免过多的请求被发送到数据库
- 将流量限制在数据库可处理的范围内
-
-
其次 事前预防
- 通过主从节点的方式构建 Redis 缓存高可靠集群\
-
\
缓存击穿(热点数据)
- 基本概念:针对某个访问非常频繁的热点数据的请求,无法在缓存中进行处理,紧接着,访问该数据的大量请求,一下子都发送到了后端数据库,导致了数据库压力激增
- 出现的原因:参考缓存雪崩
- 解决办法:可以针对热点数据不设置过期时间(确定不用后手动删除掉)
\
缓存穿透
-
基本概念:缓冲中和数据库都没有的数据,导致每次都需要到数据库中查询
-
出现的原因:
-
缓存中的数据和数据库中的数据被误删除了,所以缓存和数据库中都没有数据\
-
恶意攻击
-
-
解决方案
-
1.缓存空值或缺省值,避免大量穿透请求
-
2.使用布隆过滤器 bitmap+hash值 会拦截大量请求
-
写操作
- 使用n个hash函数计算hash值
- 对bitmap取模
- 将bitmap设置为1
-
读操作
-
计算hash\
-
取模
-
判断是否为1
-
-
-
3.前端进行请求检测
- 原因:大量的恶意请求访问不存在的数据,进行合理的参数校验\
-
\
总结
-
只要发生缓存雪崩、击穿和穿透就会导致所有请求到达数据库层,最终导致数据库当或故障
-
缓存雪崩和击穿是因为数据没有在缓冲中
-
缓存长投是既不在缓存中也不在数据库中
-
其中
-
熔断和限流是有损方案
-
尽量使用预防式方案
-
针对缓存雪崩,合理地设置数据过期时间,以及搭建高可靠缓存集群\
-
针对缓存击穿,在缓存访问非常频繁的热点数据时,不要设置过期时间\
-
针对缓存穿透,提前在入口前端实现恶意请求检测,或者规范数据库的数据删除操作,避免误删除
-
-