你好,我是小零。和你一样的开发者。
今天的知识点是缓存击穿,缓存穿透和缓存雪崩。
- 缓存雪崩:在某一时刻大量的key过期,如果某一时刻大量的请求,来请求这些key。这些请求由于在缓存中读不到数据,请求将会直接打到数据库。导致数据库的性能出现短时卡顿,甚至可能直接让数据库宕机。
- 缓存击穿:缓存击穿和缓存雪崩有点类似,不同的是缓存击穿是某个key过期,导致如果在某一时刻,大量的并发请求读取不到缓存中的这个数据,就会将请求直接打到数据库。造成数据库出现瓶颈问题。
- 缓存穿透:缓存穿透其实是系统接口层面参数设置不合理导致的。比如某个接口的请求参数是userId,如果没有对该接口进行参数合理性校验处理的话,就会发生userId=-1的请求情况出现。而userId=-1不仅没有在缓存中同样也不太可能出现在数据库中。如果某个恶意攻击发起“肉鸡攻击”——在短时间内用userId=-1不断请求这个接口,同样也会导致数据库出现瓶颈,甚至于直接宕机。
那么怎么来解决这些问题呢? 缓存雪崩可以不设置一些热点数据的key过期时间。同样缓存击穿也是这个解决方案。而对于 缓存穿透,可以进行接口参数的合理性校验处理,或者设置IP黑名单的方式,避免同一ip在一瞬间可以发送大量请求,使用布隆过滤器。