缓存穿透(cache penetration)

缓存穿透指既不存在缓存也不存在于数据库的数据被访问,所有的查询请求都直接打到数据库。这种数据可能被恶意请求,对数据库造成压力。

Solution:

  1. 对请求进行初步检查,过滤掉显然非法的访问。
  2. 在缓存写入 empty 数据,并设置一个较短的过期时间。
  3. 使用 Bloom filter。

缓存击穿(cache breakdown)

缓存击穿指某条热点数据不在缓存中,同时有大量的请求访问该数据,所有的请求将打到数据库。

Solution:

  1. 热点数据永不过期,同时使用后台任务主动更新缓存,而不是被动写入缓存。
  2. 使用互斥锁,当缓存不存在时,只允许一个请求查询数据,其它未获取到锁的请求将挂起直到缓存ready。为避免过多挂起请求,挂起的请求到一定数量后将直接返回失败响应。

缓存雪崩(cache avalanche)

缓存雪崩指短时间内大批量缓存失效或者缓存服务不可用,请求压力直接来到数据库。通常同样的过期时间可能引起类似的问题。

Solution:

  1. 为缓存过期时间加上一个随机的偏移量。
  2. 如果是热点数据,在服务启动时就主动将数据加载进缓存,同时不设置过期时间。
  3. 设置 backup 缓存服务提高缓存可用性。
  4. 对数据库访问限流,避免大量请求将数据库击溃。