高并发下的缓存击穿

高并发下的缓存击穿

什么是缓存击穿

  缓存击穿是指大量并发访问同一个热点数据,当热点数据失效后同时去请求数据库,瞬间耗尽数据库资源,导致数据库无法使用。比如某手机新品发布,当缓存失效时有大量并发到来导致同时去访问数据库。

如何解决缓存击穿

  1. 使用同步锁控制查询数据库的线程

    使用同步锁控制查询数据库的代码,只允许有一个线程去查询数据库,查询得到数据库存入缓存。

    //单锁双检模式
    public  CoursePublish getCoursePublishCache(Long courseId){
    
           //查询缓存
            Object  jsonObj = redisTemplate.opsForValue().get("course:" + courseId);
            if(jsonObj!=null){
               String jsonString = jsonObj.toString();
               CoursePublish coursePublish = JSON.parseObject(jsonString, CoursePublish.class);
               return coursePublish;
           }else{
               synchronized(this){
                   Object  jsonObj = redisTemplate.opsForValue().get("course:" + courseId);
                   if(jsonObj!=null){
                      String jsonString = jsonObj.toString();
                       CoursePublish coursePublish = JSON.parseObject(jsonString, CoursePublish.class);
                       return coursePublish;
                   }
                    System.out.println("=========从数据库查询==========");
                   //从数据库查询
                   CoursePublish coursePublish = getCoursePublish(courseId);
                 //设置过期时间300秒
                   redisTemplate.opsForValue().set("course:" + courseId, JSON.toJSONString(coursePublish),300, TimeUnit.SECONDS);
                   return coursePublish;
               }
           }
    
    }
    
  2. 热点数据不过期

  可以由后台程序提前将热点数据加入缓存,缓存过期时间不过期,由后台程序做好缓存同步。

posted @ 2023-06-26 22:00  渺阴丶  阅读(19)  评论(0)    收藏  举报