Redis中的穿透、雪崩、击穿问题

缓存击穿

原因

Redis中热点数据失效的瞬间,所有的请求都打到MySQL数据库上面,击穿了Redis的缓存,导致性能下降

image-20240218210704848

解决方案

  1. 设置热点数据永不过期
  2. 设置加锁队列(线程锁或分布式锁),先让一个线程去数据库查到数据,缓存到Redis中,然后其他线程再来Redis中取数据

缓存雪崩

原因

Redis中缓存的很多数据,在同一时刻失效,或Redis缓存服务器宕机,而导致请求全部打到MySQL上面,给MySQL造成巨大压力

image-20240218204959843

解决方案

  1. 将缓存数据的过期时间设为随机,避免其都在同一时刻失效
  2. Redis的高可用,集群+哨兵

缓存穿透

原因

查询的数据在数据库和缓存中都不存在,恶意请求数据,导致每次请求都要去查询数据,导致数据库压力过大或宕机

image-20240218211757292

解决方案

  1. 对请求参数进行校验(无法完全避免)
  2. 将数据库中不存在的数据也缓存到Redis中,避免每次收到数据库中进行查询
  3. 布隆过滤器

参考:

1.【趣话Redis第一弹】我是Redis,MySQL大哥被我坑惨了!

2.【阿里二面:说说你在项目中是怎么解决redis穿透、雪崩、击穿问题的?一口气说了17分钟。。】