首页 > 其他分享 >高并发下的缓存击穿

高并发下的缓存击穿

时间:2023-06-26 22:26:44浏览次数:48  
标签:jsonObj 缓存 courseId 数据库 击穿 并发 coursePublish CoursePublish

高并发下的缓存击穿

什么是缓存击穿

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

如何解决缓存击穿

  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. 热点数据不过期

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

标签:jsonObj,缓存,courseId,数据库,击穿,并发,coursePublish,CoursePublish
From: https://www.cnblogs.com/miaoyindian/p/17506838.html

相关文章

  • 高并发下的缓存雪崩
    高并发下的缓存雪崩什么是缓存雪崩缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。造成缓存雪崩问题的原因是是大量key拥有了相同的过期时间,比如对课程信息设置缓存过期时间为10分钟,在大量请求同时查询大量的......
  • 如何提高服务的并发性能?
    一、应用层面读写分离、缓存、ES、线程池、多线程、队列、集群、令牌、系统拆分、隔离、系统升级(可水平扩容方向)、限流、页面静态化。1、页面静态化通过Freemarker对页面进行静态化,减少用户与服务器端的交互。二、时间换空间降低单次请求时间,这样在单位时间内系统并发就会提......
  • 因并发而生,因云计算而热
    因并发而生,因云计算而热2008年11月17日,51CTO联合人民邮电出版社图灵公司邀请了《Erlang程序设计》一书的译者赵东炜老师和在Erlang开发方面有着丰富经验的成立涛老师作客51CTO聊天室,就Erlang程序设计语言和云计算方面的话题与网友进行了深入交流。 本次聊天活动......
  • 缓存与DB数据一致性问题解决的几个思路
    使用缓存必然会碰到缓存跟真实数据不一致的问题,虽然我们会在数据发生变化时通知缓存,但是这个延迟时间内必然会导致数据不一致,如何解决一般有下面几个思路:首先,当这个延迟如果在业务上时可以接受的,比如文章阅读、评论次数这样的缓存数据,这样的问题这里不考虑。 类似数据库分布式事务......
  • MyBatis 缓存
     MyBatis一级缓存1一级缓存原理在一次SqlSession中(数据库会话),程序执行多次查询,且查询条件完全相同,多次查询之间程序没有其他增删改操作,则第二次及后面的查询可以从缓存中获取数据,避免走数据库。 每个SqlSession中持有了Executor,每个Executor中有一个LocalCache。当用......
  • Go学习圣经:Go语言实现高并发CRUD业务开发
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • 2023-06-25:redis中什么是缓存穿透?该如何解决?
    2023-06-25:redis中什么是缓存穿透?该如何解决?答案2023-06-25:缓存穿透缓存穿透指的是查询一个根本不存在的数据,在这种情况下,无论是缓存层还是存储层都无法命中。因此,每次请求都需要访问数据库,这将导致不存在的数据每次都需要查询存储层,这样缓存就失去了保护后端存储的作用。缓存穿透......
  • 2023-06-25:redis中什么是缓存穿透?该如何解决?
    2023-06-25:redis中什么是缓存穿透?该如何解决?答案2023-06-25:缓存穿透缓存穿透指的是查询一个根本不存在的数据,在这种情况下,无论是缓存层还是存储层都无法命中。因此,每次请求都需要访问数据库,这将导致不存在的数据每次都需要查询存储层,这样缓存就失去了保护后端存储的作用。缓存......
  • Spring三级缓存与循环依赖
    三级缓存//一级缓存,存放的是完整的beanprivatefinalMap<String,Object>singletonObjects=newConcurrentHashMap<>(256);//二级缓存,存放的是半成品的bean,未完成属性注入privatefinalMap<String,Object>earlySingletonObjects=newHashMap<>(16);//三级缓存,存放的......
  • 记录--强制缓存这么暴力,为什么不使用协商缓存
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前段时间在看面经的时候,发现很多份面经中都被问到了强缓存和协商缓存。因此我觉得有必要写一篇文章来好好聊聊这两者。强缓存和协商缓存浏览器缓存是浏览器在本地磁盘对用户最近请求过的文档进行存储,当访问......