Redis 雪崩、穿透、击穿

穿透

理解:缓存中没有,数据库也没有
原因: 参数不对,比如ID为负数或者比数据表中最大的ID还大;本来就不存在
解决:参数验证,不对返回,验证通过没有查到给他一个缓存值null并加上短暂缓存时间

击穿

理解:热点key在高并发时突然失效了,大量的请求瞬间会把DB压垮
原因:比如缓存时间到了
解决:热点key不过期,互斥锁如下

public String get(key) {      
    String value = redis.get(key);      
    if (value == null) { //代表缓存值过期         
     //设置3min的超时,防止del操作失败的时候,下次缓存过期一直不能load db     
         if (redis.setnx(key_mutex, 1, 3 * 60) == 1) {  //代表设置成功                               
             value = db.get(key);                      
             redis.set(key, value, expire_secs);                              
             redis.del(key_mutex);              
        } else {  //这个时候代表同时候的其他线程已经load db并回设到缓存了,这时候重试获取缓存值即可                      
        sleep(50);                      
        get(key);  //重试             
         }          
     } else {              
        return value;                
    }
}  

雪崩

理解:多个key失效,有点像多个击穿就雪崩
原因:缓存层由于某种原因宕机、失效,或者缓存过期时间结束时间在同一时间
解决:缓存时间后加上一个五分钟随机时间,热点数据不过期;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值