Java微服务:缓存穿透和缓存雪崩

Java微服务:缓存穿透和缓存雪崩

缓存穿透

  缓存是对数据库的一道保护墙,缓存穿透就是冲破了我们的保护墙。即调用方传来的永远都是我们缓存中不存在的Key,这样每次都需要去数据库中查询一次,当大量这样的请求过来时,瞬时数据库的压力会很大,相当于没用到缓存,同时还增加了去缓存中查找数据的时间,这就是所谓的缓存穿透。

解决方案

  • 将该Key缓存下来,以便下次走缓存。但是恶意估计下,Key肯定不固定,该方案没用。
  • 根据Key的规则做一些过滤,判断Key的合法性,不合法直接返回默认值。这种方案可以解决一部分问题,使用场景较少。
  • 通过布隆过滤器实现对缓存的校验。

缓存雪崩

  缓存雪崩指的是,大量缓存同一时间失效,这样所有的请求都会直接去查询数据库,导致数据库压力过大,然后挂掉的情况。

注:缓存穿透也可以导致缓存雪崩的发生,但是根本原因不一样,所以两个概念不能混用!

  缓存雪崩乐观情况下是存储层能抗住,但是用户体验会受到影响,数据返回慢,当压力过大时会导致存储层直接挂掉,整个系统直接挂掉。对于要做到99.99%高可用的产品,是绝对不允许出现缓存雪崩的现象。

解决方案

  • 缓存存储高可用,比如Redis集群。
  • 缓存失效时间设置好,避免同一时间失效。
  • 热点数据,定时更新,避免自动失效。
  • 服务限流和接口限流。
  • 对数据库查询做优化,下策为加锁,可以避免数据库挂掉。

参考资料

  • 《Spring Cloud微服务 入门、实战与进阶》

 

posted @ 2020-06-28 14:25  子烁爱学习  阅读(863)  评论(0编辑  收藏  举报