1.1.1. 缓存穿透-缓存击穿-缓存雪崩

正常情况下一个查询请求是这样一个流程。

缓存穿透

缓存穿透是指,查询一个不存在的数据,而用户不断发送请求,不会经过 Redis ,直接查询数据库,导致数据库压力过大。

解决方案:

  1. 对于 id<0 的请求,直接过滤。
  2. 当如果在数据库中没有查到时,可以设置一个值为 null 的 key 放入 redis,下次查询时直接走 redis。避免恶意攻击。

缓存击穿

对于一个设置了过期时间的 key,当有超高并发对其访问时,缓存过期,这时同时读取数据库导致数据库压力过大甚至崩溃。

解决方案:

  1. 设置分布式锁。
  2. 热点数据永不过期。
  3. 请求时,对 key 的剩余时间进行检查,快要过期的 key 加过期时间。

缓存雪崩

缓存设置了相同时间的过期时间。导致某一时刻突然失效,对 redis 服务器造成卡顿阻塞。对数据库产生大量请求,导致数据库压力过大甚至崩溃。(与「缓存击穿」不同的是「缓存击穿是指一个 key 失效」,「缓存雪崩」是不同 key 失效。)

解决办法:

  1. 设置缓存时间增加随机值。避免设置成同一过期时间。
  2. 热点数据永不过期。
  3. 分布式锁解决。
Copyright © Kagami丶 2019 all right reserved,powered by Gitbook该文件修订时间: 2019-12-10 20:22:28

results matching ""

    No results matching ""