淘先锋技术网

首页 1 2 3 4 5 6 7

本文主要介绍一下缓存雪崩、缓存穿透、缓存击穿三者的区别,以及如何避免。

缓存雪崩

缓存承担了大量的查询请求,有力的保护了数据库,但是某一时刻,缓存的数据全部失效,或者缓存宕机,导致所有的查询都落入到了数据库上,数据库突然收到暴增的流量,严重会导致数据库宕机。
解决方案:

  1. 设置缓存失效时间时,加入随机值,避免大量缓存同时失效。
  2. 使用redis集群。
  3. 对后端资源的访问,比如数据库,使用限流工具。

缓存穿透

缓存穿透是查询一个不存在的数据,在缓存上没有命中,程序接着访问数据库,数据库也没有命中,同时查询完数据库后缓存也没有写入数据。
当出现大量的这种请求时,这些请求都会打到数据库上,严重会造成数据库宕机。
解决方案:

  1. 访问缓存前使用布隆过滤器过滤请求;
  2. 缓存这些不存在的数据;
  3. 分析不存在数据的规则,在程序中对其过滤。

缓存击穿

某一个热点key过期瞬间,大量对该key的查询请求会落入到数据库上,导致数据库压力倍增。
造成缓存击穿的原因有以下两个:

  • 该数据没有人查询过 ,第一次就大并发的访问。(冷门数据)
  • 添加到了缓存,reids有设置数据失效的时间 ,这条数据刚好失效,大并发访问(热点数据)

解决方案:

  1. 缓存未命中时,对该key加锁,确保只有一个线程访问数据库,从数据库查询回来后解锁,其他加锁失败的线程等待直到解锁。