高并发下如何避免缓存穿透,缓存击穿,缓存雪崩

总的来说就是高并发情况下大量的请求没有直接落到redis中,而是直接打在了DB上,造成数据库请求压力倍增,进而导致接口反应变慢,可能造成熔断,限流等,严重的话可能造成数据库崩溃。

缓存雪崩

  1. 缓存中存在大量的key,但是这些中的过期时间一样,在高并发请求时,集体过期了。造成了所有的请求也直接打在了DB上,进而产生上面提到的严重的后果。
  2. 一般在系统刚启动的时候可能出现,因为系统刚启动时候,redis中没有数据。
  3. redis直接挂了。

解决方案:

  1. 所有的key不要设置成一样的过期时间。
  2. 加互斥锁,只有一个请求拿到锁去查询数据库,查到数据后放入缓存,后面排队的请求就去查redis,不会去查DB了。
  3. 缓存预热,在系统启动的时候去查询数据库,把数据放缓存中。
  4. 给每一个缓存数据增加标记,记录缓存是否失效,若失效,更新缓存。
  5. 增加高可用redis集群,分片,主从,双边等方案。

缓存穿透

缓存中不存在这样的key,数据库中也不存在这样的数据,最终导致所有的请求全部打在了DB上,虽然DB也没有,但是还是会去查询数据库,导致正常业务查询变慢甚至拿不到查询连接,这种方式被用于黑客的攻击手段。

解决方案:

  1. 在接口中直接过滤,拒绝请求。
  2. 使用布隆过滤器。(就是把这个key经过运算,如果在我们的bitmap中,就放行)

缓存击穿

缓存击穿是指redis中存在一个热门的key,高并发情况下,短时间内这个key会有大量的读请求打在上面,但恰好这个key过期了,所以请求就直接打到了DB上。

解决方案:

  1. 设置这个key永不过期。
  2. 加互斥锁,只有一个请求拿到锁去查询数据库,查到数据后放入缓存,后面排队的请求就去查redis,不会去查DB了。