缓存穿透
缓存穿透是指,缓存和数据库都没有的数据,被大量请求,比如订单号不可能为-1
,但是用户请求了大量订单号为-1
的数据,由于数据不存在,缓存就也不会存在该数据,所有的请求都会直接穿透到数据库。
注意:穿透的意思是,都没有,直接一路打到数据库。
那对于这种情况,我们该如何解决呢?
- 接口增加业务层级的
Filter
,进行合法校验,这可以有效拦截大部分不合法的请求。 - 布隆过滤器
- 缓存无效数据
缓存击穿
缓存击穿是指数据库原本有得数据,但是缓存中没有,一般是缓存突然失效了,这时候如果有大量用户请求该数据,缓存没有则会去数据库请求,会引发数据库压力增大,可能会瞬间打垮。
针对这类问题,一般有以下做法:
- 如果是热点数据,可以设置永远不过期。
- 如果数据一定会过期,那么就需要在数据为空的时候,设置一个互斥的锁,只让一个请求通过,只有一个请求去数据库拉取数据,取完数据,不管如何都需要释放锁,异常的时候也需要释放锁,要不其他线程会一直拿不到锁。
缓存雪崩
缓存雪崩是指缓存中有大量的数据,在同一个时间点,或者较短的时间段内,全部过期了,这个时候请求过来,缓存没有数据,都会请求数据库,则数据库的压力就会突增,扛不住就会宕机。
针对这种情况,一般我们都是使用以下方案:
- 如果是热点数据,那么可以考虑设置永远不过期。
- 缓存的过期时间除非比较严格,要不考虑设置一个波动随机值
- 分布式。
- 也可以考虑双缓存的方式,A设置过期时间,B不设置过期时间