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

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

相关推荐
天疆说8 小时前
腾讯会议 Linux 版在 NVIDIA 显卡上看不到画面:EGL 像素配置与窗口视觉不匹配的排查与修复
linux·数据库·腾讯会议
2603_969579288 小时前
中小团队数据库选型:MySQL vs PostgreSQL,业务场景怎么选
数据库·mysql·postgresql
IT大白鼠9 小时前
图数据库系列 · 第 06 篇——避坑汇总:经典生产问题
数据库·nosql·图库数据库
江湖有缘9 小时前
3开源Sqlite数据库管理工具整理合集,可Docker一键部署!
数据库·sqlite·开源
hweiyu009 小时前
Redis命令:HRANDFIELD
redis·缓存
jyOverQ9 小时前
Redis 持久化怎么做?RDB、AOF 与混合持久化
数据库·redis
j7~9 小时前
【C++ 标准项目】发布订阅消息队列(篇四):sqlite 与 gtest 断言框架介绍及实战应用
数据库·sqlite·gtest·断言·事件机制·tset宏
于指尖飞舞9 小时前
mysql和redis面试题总结
数据库·redis·mysql
维克兜率天9 小时前
【维克】通道突破:画出趋势的“轨道线“
前端·数据库·人工智能