Redis高级——缓存预热、缓存雪崩、缓存击穿、缓存穿透

缓存预热

简介

缓存预热指系统上线后,将相关的热点数据直接加载到缓存系统,以避免用户请求的时候,缓存中没有数据,每个请求直接访问数据库,导致服务器迅速宕机

解决方案

  • 根据当天的访问情况,统计出热点数据
  • 创建脚本文件,在启动服务器时自动将热点数据写入缓存

缓存雪崩

简介

较短时间内,Redis 中大量的 key 过期,同时又有大量的请求到达,导致大量请求直接到达数据库,数据库压力激增而宕机,数据库重启后,仍然没有解决缓存中无数据的问题,又会迅速被大量的请求瞬间放倒,最后面临着 Redis 集群崩溃,应用服务器崩溃的局面

解决方案

根本方案

  • 设置部分热点数据永不过期
  • 设置数据过期时间随机生成,保证数据不会在同一时间大面积过期
  • 自动或人工定期维护,对过期数据进行访问量分析,以判断是否要做延时

缓解方案

  • 构建多级缓存,每一级缓存的过期时间不同,当一级缓存不可用时使用下一级缓存代替
  • 进行限流降级,限制部分服务器请求,通过互斥锁控制对同一个 key 的访问线程数,降低服务器压力
  • 对数据库的瓶颈任务进行优化

缓存击穿

简介

在短时间内,大量请求同时访问一个 Redis 中不存在(可能是过期)的数据,Redis 未命中后大量请求同时到达数据库,导致数据库压力激增而宕机

解决方案

  • 设置部分热点数据永不过期
  • 使用互斥锁限制访问,会一定程度影响吞吐量,不推荐使用

缓存穿透

简介

用户不断向缓存和数据库中都不存在的数据发起请求,通常为非正常 URL,缓存大面积未命中后大量请求到达数据库,数据库由于没有该数据,也无法更新缓存,导致缓存与数据库负载增大,甚至宕机,这时的用户很可能是攻击者

解决方案

  • 对查询结果为空的请求,缓存空对象到 Redis 中,并设置较短的过期时间(一般不超过五分钟)
  • 对数据接口层设置相应的校验,拦截非法请求
  • 提前预热一个存储了所有数据的 Bitmap ,维护各个数据是否存在于 Redis 的状态,以此对到达 Redis 的请求进行过滤,待查询数据不在 Redis 时,视为异常请求,直接拦截
  • 使用布隆过滤器进行拦截,布隆过滤器是一种概率型数据结构,用于判断某个 key 不存在

Guess you like

Origin blog.csdn.net/qq_25274377/article/details/120864584