缓存穿透

缓存穿透是指,缓存和数据库都没有的数据,被大量请求,比如订单号不可能为-1,但是用户请求了大量订单号为-1的数据,由于数据不存在,缓存就也不会存在该数据,所有的请求都会直接穿透到数据库。

注意:穿透的意思是,都没有,直接一路打到数据库。

那对于这种情况,我们该如何解决呢?

  1. 接口增加业务层级的Filter,进行合法校验,这可以有效拦截大部分不合法的请求。
  2. 布隆过滤器
  3. 缓存无效数据

缓存击穿

缓存击穿是指数据库原本有得数据,但是缓存中没有,一般是缓存突然失效了,这时候如果有大量用户请求该数据,缓存没有则会去数据库请求,会引发数据库压力增大,可能会瞬间打垮。

针对这类问题,一般有以下做法:

  1. 如果是热点数据,可以设置永远不过期
  2. 如果数据一定会过期,那么就需要在数据为空的时候,设置一个互斥的锁,只让一个请求通过,只有一个请求去数据库拉取数据,取完数据,不管如何都需要释放锁,异常的时候也需要释放锁,要不其他线程会一直拿不到锁。

缓存雪崩

缓存雪崩是指缓存中有大量的数据,在同一个时间点,或者较短的时间段内,全部过期了,这个时候请求过来,缓存没有数据,都会请求数据库,则数据库的压力就会突增,扛不住就会宕机。

针对这种情况,一般我们都是使用以下方案:

  1. 如果是热点数据,那么可以考虑设置永远不过期。
  2. 缓存的过期时间除非比较严格,要不考虑设置一个波动随机值
  3. 分布式。
  4. 也可以考虑双缓存的方式,A设置过期时间,B不设置过期时间