3.分布式缓存(击穿、雪崩、穿透)

2019-12-09  本文已影响0人  指尖架构141319

1.概念示意图

1.1缓存击穿
1.2缓存雪崩
1.3缓存穿透

2.解决方案

2.1 击穿和雪崩

加锁、限流代码实现:

       if (valueWrapper != null) {//缓存中查询
            logger.info("缓存中得到数据");
            return (Provinces) (valueWrapper.get());
        }
        //2.加锁排队,阻塞式锁
        doLock(provinceid);
        try{//第二个线程进来了
             //双重校验
            valueWrapper = redisTemplate.get(provinceid);//第二个线程,能从缓存里拿到值?
            if (valueWrapper != null) {
                logger.info("缓存中得到数据");
                return (Provinces) (valueWrapper.get());//第二个线程,这里返回
            }
            Provinces provinces = super.detail(provinceid);
            // 3.从数据库查询的结果不为空,则把数据放入缓存中,方便下次查询
            if (null != provinces){
                cm.getCache(CACHE_NAME).put(provinceid, provinces);
            }
          return provinces;
        }catch(Exception e){
            return null;
        }finally{
            //释放锁
            releaseLock(provinceid);
        }
2.2缓存穿透
上一篇下一篇

猜你喜欢

热点阅读