> 文章列表 > 缓存雪崩、缓存穿透、缓存击穿分别是什么?如何解决?

缓存雪崩、缓存穿透、缓存击穿分别是什么?如何解决?

缓存雪崩、缓存穿透、缓存击穿分别是什么?如何解决?

缓存中存放的大多都是热点数据,目的就是从缓存中获取数据,而不用直接访问数据库,从而提高查询效率

  1. 缓存雪崩

概念

  • 指缓存在同一时间大面积失效,后面的请求直接访问数据库,导致数据库短时间内压力过大而崩溃(缓存无数据,数据库有数据)

解决方案

  • 设置过期时间时,增加一点随机值,防止大量缓存数据同时过期
  • 缓存预热(程序刚部署的时候,缓存中是没有数据的,可以写个接口,在程序启动的时候把数据放入缓存)
  • 使用锁,排队请求
  • 给每一个缓存数据增加相应的缓存标记,记录缓存是否失效,如果缓存失效则更新(不推荐,耗费性能)
  • 定时更新缓存(不推荐,耗费性能)
  1. 缓存穿透

概念

  • 指缓存和数据库中都没有请求的数据,所以每次请求也直接访问数据库,导致数据库短时间内压力过大而崩溃(缓存无数据,数据库也无数据)

解决方案

  • 使用布隆过滤器,拦截不存在的 key
  • 记录请求的 key,将 null 值存入缓存(针对暴力请求少数 key 的情况可以使用此方法,但当黑客请求大量的无效 key 时,将会占用大量内存,此时不太推荐)
  • 请求校验(造成缓存穿透的场景之一是黑客攻击,可增加用户校验、参数校验等)
  1. 缓存击穿

概念

  • 和缓存雪崩类似,缓存雪崩是大面积缓存失效,而缓存击穿是某一个热点 key 突然失效,高并发导致数据库短时间内压力过大而崩溃(缓存中无某条数据,数据库中有此数据)

解决方案

  • 设置热点 kye 不过期
  • 使用锁,排队请求