缓存击穿、穿透、雪崩

缓存击穿,穿透,雪崩

缓存击穿

  高并发系统中,大量的请求一般会落在缓存,但在某一时期,某一热点key过期,会导致大量的请求直接落到数据库,导致数据库崩溃。

解决

  1. 设置热点key不过期。
  2. 加上分布式锁,每次只有拿到锁的线程可以去访问数据库。第一个线程查询到后就会缓存起来,后面线程从缓存中拿。

缓存穿透

  正常情况下,需要查询的数据都存在,当查询一个缓存和数据库都不存在的数据时,每次请求都会落在数据库里,这种情况成称为缓存穿透。就是以一个不存在的数据去请求,每次都会落到数据库。

解决:

  1. 接口增加参数校验,不合法的直接返回。
  2. 缓存空值,将对应key的value设置为空值,避免暴力攻击。同时将key失效时间设置短一些,避免影响正常使用。
  3. 在网关阈值,限制同ip访问量。
  4. 高级用户布隆过滤器。bloom filter,可以对key进行判断是否在数据库存在,不存在就直接返回,存在就查询出来,并刷新缓存。

缓存雪崩

  某一时期发生的大规模的缓存不可用问题,过期,宕机。

解决:

  1. 采用分布式集群,减少宕机风险。
  2. 将失效时间设为随机数,避免大量同时失效。
  3. 采用本地缓存加限流逻辑。