Java微服务:缓存穿透和缓存雪崩
Java微服务:缓存穿透和缓存雪崩
缓存穿透
缓存是对数据库的一道保护墙,缓存穿透就是冲破了我们的保护墙。即调用方传来的永远都是我们缓存中不存在的Key,这样每次都需要去数据库中查询一次,当大量这样的请求过来时,瞬时数据库的压力会很大,相当于没用到缓存,同时还增加了去缓存中查找数据的时间,这就是所谓的缓存穿透。
解决方案
- 将该Key缓存下来,以便下次走缓存。但是恶意估计下,Key肯定不固定,该方案没用。
- 根据Key的规则做一些过滤,判断Key的合法性,不合法直接返回默认值。这种方案可以解决一部分问题,使用场景较少。
- 通过布隆过滤器实现对缓存的校验。
缓存雪崩
缓存雪崩指的是,大量缓存同一时间失效,这样所有的请求都会直接去查询数据库,导致数据库压力过大,然后挂掉的情况。
注:缓存穿透也可以导致缓存雪崩的发生,但是根本原因不一样,所以两个概念不能混用!
缓存雪崩乐观情况下是存储层能抗住,但是用户体验会受到影响,数据返回慢,当压力过大时会导致存储层直接挂掉,整个系统直接挂掉。对于要做到99.99%高可用的产品,是绝对不允许出现缓存雪崩的现象。
解决方案
- 缓存存储高可用,比如Redis集群。
- 缓存失效时间设置好,避免同一时间失效。
- 热点数据,定时更新,避免自动失效。
- 服务限流和接口限流。
- 对数据库查询做优化,下策为加锁,可以避免数据库挂掉。
参考资料
- 《Spring Cloud微服务 入门、实战与进阶》