文章目录
- 一、书接上文
- 二、介绍
- 三、解决方案
- 1. 单例双检锁
- 2. 缓存预热和定时任务
一、书接上文
Redis之缓存雪崩问题解决方案
二、介绍
缓存击穿就是大量并发访问同一个热点数据,一旦这个热点数据缓存失效,则请求压力都来到数据库。
三、解决方案
1. 单例双检锁
@Overridepublic CoursePublish getCoursePublishCache(Long courseId) {String key = "content:course:publish:" + courseId;//布隆过滤器boolean contains = bloomFilter.contains(key);if (!contains){return null;}//先查询redisObject object = redisTemplate.opsForValue().get(key);if (object != null){String string = object.toString();CoursePublish coursePublish = JSON.parseObject(string, CoursePublish.class);return coursePublish;}else {//后查询数据库//加锁,防止缓存击穿synchronized (this){//单例双检锁object = redisTemplate.opsForValue().get(key);if (object != null){String string = object.toString();CoursePublish coursePublish = JSON.parseObject(string, CoursePublish.class);return coursePublish;}CoursePublish coursePublish = getCoursePublish(courseId);if (coursePublish != null) {bloomFilter.add(key);redisTemplate.opsForValue().set(key, JSON.toJSONString(coursePublish));} else {int timeout = 10 + new Random().nextInt(20);redisTemplate.opsForValue().set(key, JSON.toJSONString(coursePublish), timeout, TimeUnit.SECONDS);}return coursePublish;}}}
2. 缓存预热和定时任务
使用缓存预热,把数据提前放入缓存,然后根据过期时间,发布合理的定时任务,主动去更新缓存,让热点数据永不过期。