高并发下的缓存击穿
什么是缓存击穿
缓存击穿是指大量并发访问同一个热点数据,当热点数据失效后同时去请求数据库,瞬间耗尽数据库资源,导致数据库无法使用。比如某手机新品发布,当缓存失效时有大量并发到来导致同时去访问数据库。
如何解决缓存击穿
-
使用同步锁控制查询数据库的线程
使用同步锁控制查询数据库的代码,只允许有一个线程去查询数据库,查询得到数据库存入缓存。
//单锁双检模式 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; } } }
-
热点数据不过期
可以由后台程序提前将热点数据加入缓存,缓存过期时间不过期,由后台程序做好缓存同步。
标签:jsonObj,缓存,courseId,数据库,击穿,并发,coursePublish,CoursePublish From: https://www.cnblogs.com/miaoyindian/p/17506838.html