redis中的击穿、穿透、雪崩

1.击穿

击穿:指的是单个key在缓存中查不到,去数据库查询,如果数据库数据量大且是高并发的(大量请求)情况下就可能会造成数据库压力过大而崩溃。

解决方案:

  1. 通过synchronized+双重检查机制:同一个key一次只能有一个线程访问,阻塞其他线程。
    缺点:效率低
  2. 设置value永不过期
    优点:可靠的,安全
    缺点:但占空间,内存消耗大,并且不能保持数据最新

2.雪崩

雪崩指的是多个key查询并且出现高并发,缓存中失效或者查不到,然后都去数据库查询,从而导致数据库崩溃。

出现雪崩的原因:多个key同时失效、或者redis崩溃失效

解决方法:

  • 在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。
  • 可以通过缓存reload机制,预先去更新缓存,在即将发生大量访问前前手动触发加载缓存
  • 不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀
  • 双缓存策略。A为原始缓存,B为拷贝缓存,A失效时,可以访问B,A失效时间设置为短期,B设置为长期。
  • 加互斥锁
public String get(key) {
      String value = redis.get(key);
      if (value == null) { //代表缓存值过期
          //设置3min的超时,防止删除失败时,下次缓存过期一直不加载数据库
          if (redis.setnx(key_mutex, 1, 3 * 60) == 1) {  //代表设置成功
               value = db.get(key);
                      redis.set(key, value, expire_secs);
                      redis.del(key_mutex);

                     return value;
              } else {  //这个时候代表同时的其他线程已经load db并回设到缓存了,这时候重试获取缓存值即可
                      sleep(10);
                      get(key);  //重试
              }
          } else {
              return value;      
          }

}

3. 穿透

频繁地恶意查询(缓存和数据库中都没有数据),从而导致数据库崩溃。

解决方法:在请求的接口中添加校验,不合法的请求直接return;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值