缓存击穿,缓存雪崩,缓存穿透的具体实例以及解决方案

技术是第一生产力

缓存穿透,击穿和雪崩

这些名词是针对redis数据库做缓存时产生的问题.

缓存穿透

缓存穿透,是指查询一个数据库一定不存在的数据,正常使用缓存的流程应该是

  1. 传进来id参数
  2. 现到reids缓存中查询对应的键
  3. 如果缓存中没有对应的value
  4. 就从数据库里查
  5. 从数据库里面查到数据放到redis缓存中

缓存穿透场景:
现在 如果有人想恶意攻击我们的数据库的话,就可以修改穿进来的参数,比如在步骤1所穿进来的商品id=-1,很明显,我们数据库里面没有id=-1的商品,那么自然就查询不到.查询不到就无法放进缓存,这样每次查询的话都是直接从数据库里进行查询,如果高频率的查询,就有可能导致数据库崩溃.

解决办法:
当查询结果为空的话,也把数据加入缓存,也就是加一个空缓存.

具体代码如下

public Good getGood(Long goodid){
   Object object = reidsTemplate.opsForValue().get(String.valueOf(goodid));
   if(object!=null){   //缓存中能查到该商品
      return (Good)object;
   }
 //没有查到,从数据库里面查
  Good good = goodDao.selectByPeimarykey(goodid);
  if(good!=null){// 把商品放入缓存
  reidsTemplate.opsForValue().set(String.ValueOf(goodid),good,60,TimeUnit.MINUTES);
  }else{
  //如果穿进来的goodid=-1,查出来的数据为空,把空值也传进reids
  reidsTemplate.opsForValue().set(String.ValueOf(goodid),good,60,TimeUnit.SECONDS);
  }


}

缓存雪崩:
缓存雪崩是指,在某一个时间段,缓存集中过期失效.

产生雪崩的原因之一,比如在写本文的时候,马上就要到双十二零点,很快就会迎来一波抢购,这波商品时间比较集中的放入了缓存,假设缓存一个小时。那么到了凌晨一点钟的时候,这批商品的缓存就都过期了。而对这批商品的访问查询,都落到了数据库上,对于数据库而言,就会产生周期性的压力波峰。
小编在做电商项目的时候,一般是采取不同分类商品,缓存不同周期。在同一分类中的商品,加上一个随机因子。这样能尽可能分散缓存过期时间,而且,热门类目的商品缓存时间长一些,冷门类目的商品缓存时间短一些,也能节省缓存服务的资源

代码块如下:

public Good getGood(Long goodid){
   Object object = reidsTemplate.opsForValue().get(String.valueOf(goodid));
   if(object!=null){   //缓存中能查到该商品
      return (Good)object;
   }
 //没有查到,从数据库里面查
  Good good = goodDao.selectByPeimarykey(goodid);
  if(good!=null){// 把商品放入缓存
      if(good.getname.equal("男装")){//热门商品
      //过期时间更改为3600+3600之内的随机分钟数  
      reidsTemplate.opsForValue().set(String.ValueOf(goodid),good,3600+new Random().nexInt(3600),TimeUnit.MINUTES);
      }
        if(good.getname.equal("女装")){//冷门商品
      //过期时间更改为3600+600之内的随机分钟数  
      reidsTemplate.opsForValue().set(String.ValueOf(goodid),good,3600+new Random().nexInt(600),TimeUnit.MINUTES);
      }
  }else{
  //如果穿进来的goodid=-1,查出来的数据为空,把空值也传进reids
  reidsTemplate.opsForValue().set(String.ValueOf(goodid),good,60,TimeUnit.SECONDS);
  }


}

其实集中过期,倒不是非常致命,比较致命的缓存雪崩,是缓存服务器某个节点宕机或断网。因为自然形成的缓存雪崩,一定是在某个时间段集中创建缓存,那么那个时候数据库能顶住压力,这个时候,数据库也是可以顶住压力的。无非就是对数据库产生周期性的压力而已。而缓存服务节点的宕机,对数据库服务器造成的压力是不可预知的,很有可能瞬间就把数据库压垮。

缓存击穿:
缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。
解决方案:
做电商项目的时候,把这个商品设置为“爆款”。
大多数情况下这种爆款很难对数据库服务器造成压垮性的压力。达到这个级别的公司没有几家的。最好是对主打商品都是早早的做好了准备,让缓存永不过期。如果某些商品自己发酵成了爆款,也是直接设为永不过期。

结语:
此文是笔者在参考了该资料.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值