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. 缓存预热和定时任务

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

相关推荐
霖霖总总4 小时前
[小技巧69]为什么总说MySQL单表“别超 2000 万行”?一篇讲透 InnoDB 存储极限
数据库·mysql
安科士andxe4 小时前
实操指南|安科士1.25G CWDM SFP光模块选型、部署与运维全攻略
运维·数据库·5g
Java爱好狂.5 小时前
RDB&AOF持久化原理解析
java·数据库·redis·后端开发·java编程·java程序员·java八股文
蓝胖子Lcl5 小时前
Mac安装Oracle数据库(M芯片)
数据库·macos·oracle
砚边数影5 小时前
从文档型数据库到企业级数据平台:一次架构演进的思考与实践
数据库·mongodb·架构·kingbase·数据库平替用金仓·金仓数据库
SQL必知必会5 小时前
SQL 删除重复行完全指南
数据库·sql
工业甲酰苯胺5 小时前
spring-事务管理
数据库·sql·spring
全栈前端老曹5 小时前
【Redis】Redis 持久化机制 RDB 与 AOF
前端·javascript·数据库·redis·缓存·node.js·全栈
李慕婉学姐6 小时前
Springboot平安超市商品管理系统6sytj3w6(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
Elastic 中国社区官方博客6 小时前
易捷问数(NewmindExAI)平台解决 ES 升级后 AI 助手与 Attack Discovery 不正常问题
大数据·运维·数据库·人工智能·elasticsearch·搜索引擎·ai