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

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

相关推荐
XDHCOM1 分钟前
TP5框架Redis分布式缓存实战,解决高并发场景下的数据一致性问题
redis·分布式·缓存
AIminminHu3 分钟前
OpenGL渲染与几何内核那点事-项目实践理论补充(一-1-(4):GstarCAD / AutoCAD 客户端相关产品 —— 深入骨髓的数据库哲学)
数据库·几何·cad开发
二等饼干~za8986688 分钟前
豆包GEO优化源码开发全解析:技术架构、实现逻辑与实操指南
数据库·sql·重构·架构·mybatis·音视频
手握风云-19 分钟前
Redis:不只是缓存那么简单(一)
redis·缓存
青梅煮酒与君饮21 分钟前
深度刨析RAG检索增强
数据库·人工智能·深度学习·语言模型·知识图谱
NineData25 分钟前
MySQL到StarRocks 同步链路中的建表、DDL 跟随与数据校验
运维·数据库·starrocks·mysql·数据迁移·数据库管理工具·ninedata
fen_fen32 分钟前
DB2表创建与Python插入、查询实操解析
数据库·oracle
yuweiade36 分钟前
docker desktop安装redis
redis·docker·容器
zdl68637 分钟前
MSSQL2022的一个错误:未在本地计算机上注册“Microsoft.ACE.OLEDB.16.0”提供程序
数据库·microsoft
gechunlian881 小时前
MySQL - Navicat自动备份MySQL数据
android·数据库·mysql