缓存预热
简介
缓存预热指系统上线后,将相关的热点数据直接加载到缓存系统,以避免用户请求的时候,缓存中没有数据,每个请求直接访问数据库,导致服务器迅速宕机
解决方案
- 根据当天的访问情况,统计出热点数据
- 创建脚本文件,在启动服务器时自动将热点数据写入缓存
缓存雪崩
简介
在较短时间内,Redis 中大量的 key 过期,同时又有大量的请求到达,导致大量请求直接到达数据库,数据库压力激增而宕机,数据库重启后,仍然没有解决缓存中无数据的问题,又会迅速被大量的请求瞬间放倒,最后面临着 Redis 集群崩溃,应用服务器崩溃的局面
解决方案
根本方案
- 设置部分热点数据永不过期
- 设置数据过期时间随机生成,保证数据不会在同一时间大面积过期
- 自动或人工定期维护,对过期数据进行访问量分析,以判断是否要做延时
缓解方案
- 构建多级缓存,每一级缓存的过期时间不同,当一级缓存不可用时使用下一级缓存代替
- 进行限流降级,限制部分服务器请求,通过互斥锁控制对同一个 key 的访问线程数,降低服务器压力
- 对数据库的瓶颈任务进行优化
缓存击穿
简介
在短时间内,大量请求同时访问一个 Redis 中不存在(可能是过期)的数据,Redis 未命中后大量请求同时到达数据库,导致数据库压力激增而宕机
解决方案
- 设置部分热点数据永不过期
- 使用互斥锁限制访问,会一定程度影响吞吐量,不推荐使用
缓存穿透
简介
用户不断向缓存和数据库中都不存在的数据发起请求,通常为非正常 URL,缓存大面积未命中后大量请求到达数据库,数据库由于没有该数据,也无法更新缓存,导致缓存与数据库负载增大,甚至宕机,这时的用户很可能是攻击者
解决方案
- 对查询结果为空的请求,缓存空对象到 Redis 中,并设置较短的过期时间(一般不超过五分钟)
- 对数据接口层设置相应的校验,拦截非法请求
- 提前预热一个存储了所有数据的 Bitmap ,维护各个数据是否存在于 Redis 的状态,以此对到达 Redis 的请求进行过滤,待查询数据不在 Redis 时,视为异常请求,直接拦截
- 使用布隆过滤器进行拦截,布隆过滤器是一种概率型数据结构,用于判断某个 key 不存在