Redis之缓存击穿问题解决方案

文章目录

一、书接上文

Redis之缓存雪崩问题解决方案

二、介绍

缓存击穿就是大量并发访问同一个热点数据,一旦这个热点数据缓存失效,则请求压力都来到数据库。

三、解决方案

1. 单例双检锁

java 复制代码
	@Override
    public CoursePublish getCoursePublishCache(Long courseId) {
        String key = "content:course:publish:" + courseId;
        //布隆过滤器
        boolean contains = bloomFilter.contains(key);
        if (!contains){
            return null;
        }
        //先查询redis
        Object 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. 缓存预热和定时任务

使用缓存预热,把数据提前放入缓存,然后根据过期时间,发布合理的定时任务,主动去更新缓存,让热点数据永不过期。

相关推荐
2301_777599374 小时前
Go语言怎么做DNS查询_Go语言DNS域名解析教程【完整】
jvm·数据库·python
tjc199010054 小时前
HTML5音频通过OscillatorNode产生基础波形测试
jvm·数据库·python
weixin_580614004 小时前
golang如何使用sync.WaitGroup_golang sync.WaitGroup并发等待使用方法
jvm·数据库·python
kiku18184 小时前
NoSQL之Redis集群
数据库·redis·nosql
2401_883600254 小时前
如何配置Oracle的外部口令存储_安全外部密码库Wallet自动登录
jvm·数据库·python
2401_897190554 小时前
如何在MongoDB中实现连表查询_group与累计求和操作
jvm·数据库·python
justjinji4 小时前
PHP源码运行是否受硬盘转速影响_7200转vs5400转对比【指南】
jvm·数据库·python
2301_796588504 小时前
如何用 error 事件全局捕获页面图片或脚本加载失败状态
jvm·数据库·python
GitCode官方4 小时前
G-Star 精选开源项目推荐|第十四期
数据库·人工智能·自动化
qq_413847404 小时前
JavaScript中利用Range对象实现复杂的文本选择操作
jvm·数据库·python