一文读懂并解决 Redis 雪崩、击穿、穿透

大家都知道缓存的两个作用,一是降低访问时间提升系统响应速度(Redis 为什么快),二是保护数据库。

如果缓存出了问题,不但起不到上述的作用,反而会成为双刃剑(降低系统响应速度 -> 打崩数据库 -> 系统崩溃)。

缓存雪崩

原因

  1. 缓存中大量的 key 在同一时刻过期,导致大量请求直接打到数据库上。
  2. Redis 实例宕机

解决方案

针对数据过期的方案:

  1. 可以分散过期时间(不同的 key 设置不同的过期时间)
  2. 可以不让其过期(看具体业务,只针对热点 key 比较好)

一些花活儿:

  1. 再构建一层缓存(构建主 key 和备 key,如果主 key 过期,会请求到备 key,同时再重新设置上主 key)
  2. 后台更新(如果发现没有了重新设置上),没啥用(不分散时间还是同一时刻过期,还是会有个间隙直接雪崩)

针对 Redis 实例宕机:

  1. 要么服务熔断、要么请求限流
  2. 构建 Redis 集群

缓存穿透

原因

请求的数据 Redis 中没有,数据库也没有。

解决方案

  1. 对不存的记录设置一个空值或者默认值直接返回
  2. 限制非法请求
  3. 布隆过滤器

缓存击穿

原因

某个热点 key 过期了,此时大量请求访问了该热点数据,由于缓存中没有,直接访问数据库。

解决方案

  1. 热点 key 永不过期
  2. 互斥锁方案:对某个请求加锁访问数据库并设置缓存(别的请求就可以查询缓存了)

总结

总的思想就是,确保实例高可用,尽量不让请求访问到数据库(缓存过期时间、不存在的值也可以缓存、限流),如果访问数据库也不能让太多请求访问数据库。

你可能感兴趣的:(编程菜鸟养成记,#,Redis,从基础到原理,redis,数据库,雪崩,击穿,穿透)