Redis:缓存击穿,缓存穿透,缓存雪崩

news2024/11/24 7:51:38

缓存穿透

缓存和数据库中都没有的数据,可用户还是源源不断的发起请求,导致每次请求都会到数据库,从而压垮数据库。

这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。

*** 解决方案**

  • 对空值进行缓存标志
    • 对于不存在的数据,同样设置一个特殊的 Value 到缓存中,并设置过期时间
  • 使用布隆过滤器
    • 如果布隆过滤器认为值不存在,那么值一定是不存在的,无需查询缓存也无需查询数据库;
    • 对于极小概率的误判请求,才会最终让非法 Key 的请求走到缓存或数据库。
  • 业务层校验
    • 用户发过来的请求,根据请求参数进行校验,对于明显错误的参数,直接拦截返回。

缓存雪崩

​ 缓存雪崩是指当缓存中有大量的key在同一时刻过期,或者Redis直接宕机了,导致大量的查询请求全部到达数据库,造成数据库查询压力骤增,甚至直接挂掉。

​ 和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

*** 现象 ** :数据库的访问压力瞬间激增,服务负载过高

产生雪崩的原因大致有两种

  • 缓存系统不可用
  • 大量的key在同一时间失效,导致大量数据回源

解决方案

  • 1、差异化缓存过期时间

    • 避免缓存设置相近的有效期,我们可以在设置有效期时增加随机值;
  • 2、缓存永不过期,后台线程刷新

    • 初始化缓存数据的时候设置缓存永不过期,然后启动一个后台线程 30 秒一次定时把所有数据更新到缓存,而且通过适当的休眠,控制从数据库更新数据的频率,降低数据库压力
  • 3、增强redis的高可用性

    • 构建 Redis 缓存高可靠集群

缓存击穿

在某些 Key 属于极端热点数据,且并发量很大的情况下,如果这个 Key 过期,可能会在某个瞬间出现大量的并发请求同时回源,相当于大量的并发请求直接打到了数据库。这种情况,就是我们常说的缓存击穿或缓存并发问题。

*** 现象 ** :数据库的访问压力瞬间激增,Redis正常运行

*** 解决办法**

  • 业务允许下,设置缓存永不过期

    • 启动一个后台线程 30 秒一次定时把所有数据更新到缓存,而且通过适当的休眠,控制从数据库更新数据的频率,降低数据库压力
  • 使用互斥锁

    • 缓存失效的时候(判断拿出来的值为空),不是立即去加载数据库。
    • 先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX)去set一个mutex key。
    • 当操作返回成功时,再进行加载数据库的操作,并回设缓存,最后删除mutex key。
    • 当操作返回失败,证明有线程在加载数据库,当前线程睡眠一段时间再重试整个get缓存的方法。

@Autowired
    private RedissonClient redissonClient;
    @GetMapping("mutex")
    public String mutex() {
        String data = stringRedisTemplate.opsForValue().get("hot_key");
        if (StringUtils.isEmpty(data)) {
            RLock locker = redissonClient.getLock("mutex_locker");
            //获取分布式锁
            if (locker.tryLock()) {
                try {
                    data = stringRedisTemplate.opsForValue().get("hot_key");
                    //双重检查,因为可能已经有一个B线程过了第一次判断,在等锁,然后A线程已经把数据写入了Redis中
                    if (StringUtils.isEmpty(data)) {
                        //回源到数据库查询
                        data = getDatabaseData();
                        stringRedisTemplate.opsForValue().set("hot_key", data, 5, TimeUnit.SECONDS);
                    }
                } finally {
                    //别忘记释放,另外注意写法,获取锁后整段代码try+finally,确保unlock万无一失
                    locker.unlock();
                }
            }
        }
        return data;
    }

缓存穿透和缓存击穿的区别:

  • 缓存穿透是指,缓存没有起到压力缓冲的作用;
  • 而缓存击穿是指,缓存失效时瞬时的并发打到数据库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2046032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

音乐生成模型应用

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

根据年月计算当月有哪几个周,及每周的起止日期

示例 传参数年、月,返回包含当月的所有周数、及周的起止日期,支持跨月 特殊情况请自行修改函数 console.log(getWeeksInMonth(2024, 9));返回如下 源码 源码以elementUI的周选择框的起止日期作为参考 function getWeeksInMonth(year, month) {// 计…

讲透一个强大算法模型,Transformer !!零基础入门到精通,收藏这一篇就够了

哈喽,我是cos大壮!~ **首先,官话:**Transformer 模型是由 Vaswani 等人在 2017 年提出的一种新型神经网络架构,用于解决序列到序列的任务,比如机器翻译、文本生成等。它的核心思想是通过「注意力机制」来捕…

冷知识:编程第一人是位伟大的女性

冷门智慧:阿达编程先驱的传奇人生揭秘在线播放免费听 - 喜马拉雅手机版欢迎收听由主播壹道徽为您带来的“冷门智慧:阿达编程先驱的传奇人生揭秘”精彩有声内容,该音频时长5分18秒,已被收听1062次,用户嘎嘎呗嘎嘎评价说…

关于msvcp120.dll丢失的解决方法的详细步骤教程,一步步教你修复丢失错误

msvcp120.dll是一个动态链接库文件(DLL),它是 Microsoft Visual C 2013 Redistributable 的一部分。这个文件对于运行使用 C 编写的多种Windows应用程序非常重要。以下解析将分为几个部分来详细探讨此文件的来源、功能、重要性及其可能遇到的…

暑期全新测评《黑神话悟空》显卡测试与录屏工具推荐:性能优化与屏幕捕捉技巧

随着《黑神话悟空》这款备受期待的游戏即将问世,玩家们不仅对游戏的画质和性能充满好奇,更希望能够记录下游戏中的每一个精彩瞬间。本文将为您提供一份全面的指南,不仅包括《黑神话悟空》在主流显卡上的帧数测试结果,画质选项的优…

Windows Server 使用Docke部署挂载问题(安装后无限重启崩溃迁移镜像到D盘打包镜像)

文章目录 前言一、问题:无限重启崩溃尝试:权限不足?解决:用Docker-Compose安装并挂载数据卷 二、问题:镜像磁盘默认挂载在C盘尝试:通过修改Docker修改镜像磁盘到D盘解决:通过修改docker的settin…

【OpenCV】window 下 VS Code 配置OpenCV

文章目录 前言直接使用OpenCV 编译好的库自己编译OpenCVVS Code 安装MinGW下载下载Cmake编译OpenCV VS Code 运行cv程序VSCode配置运行CV程序 参考文章 前言 在网上找了些资料,大致得出VS Code开发OpenCV的环境配置流程,如下 安装VS Code安装MinGW安装…

详解 Python 中的面向对象编程(2)

引言 面向对象编程(OOP)是一种编程范式,它通过将属性和行为整合到对象中来构建程序。本教程将带你了解Python语言中面向对象编程的基本概念。 想象一下,对象就像是系统中的各个部件。可以把程序比作一条工厂流水线。在流水线的每一…

Spring Boot 的Web开发

Spring Boot 的Web开发 一、 静态资源映射规则 总结: 只要静态资源放在类路径下: called /static (or /public or /resources or /METAINF/resources 访问 : 当前项目根路径/ 静态资源名 二、 enjoy模板引擎 Enjoy模板引擎是一个轻量级的…

50ETF期权交易小技巧分享:期权的交易规律

今天带你了解50ETF期权交易小技巧分享:期权的交易规律。50ETF期权是一种以实物华夏上证50ETF基金为标的物的金融衍生品,它允许投资者在未来某个特定时间以特定价格买入或卖出一定数量的50ETF基金。 50ETF期权交易规律 1、短线思维,最长1周时…

Python数据分析:数据可视化(Matplotlib、Seaborn)

数据可视化是数据分析中不可或缺的一部分,通过将数据以图形的方式展示出来,可以更直观地理解数据的分布和趋势。在Python中,Matplotlib和Seaborn是两个非常流行和强大的数据可视化库。本文将详细介绍这两个库的使用方法,并附上一个…

SAP MIGO屏幕增强的具体实施步骤介绍(SE19:MB_MIGO_BADI) <转载>

原文链接:https://mp.weixin.qq.com/s/cDoKsc3nBPMa0GRTtQawHw 在SAP/ERP项目实施中经常会遇到MIGO屏幕增强的需求,就是要在MIGO标准屏幕的抬头或行项目中添加一个客制化页签,在增强页签下增加一些字段供用户录入一些额外信息,比…

C语言 | Leetcode C语言题解之第338题比特位计数

题目&#xff1a; 题解&#xff1a; int* countBits(int n, int* returnSize) {int* bits malloc(sizeof(int) * (n 1));*returnSize n 1;bits[0] 0;for (int i 1; i < n; i) {bits[i] bits[i & (i - 1)] 1;}return bits; }

公钥基础设施PKI

数字证书的生成方式&#xff1a; 第一步&#xff0c;密钥生成。有两种方法&#xff0c;一是主体可以用某个软件生成的公钥/私钥对&#xff0c;主体要使生成的私钥保密&#xff0c;然后把公钥和其他信息与身份证明发送给注册机构。二是注册机构也可以为主体生成密钥对&#xff…

前端工程师如何快速入门鸿蒙开发?

在当今科技飞速发展的时代&#xff0c;前端工程师们面临着不断拓展技能边界的挑战。随着鸿蒙操作系统的崛起&#xff0c;掌握鸿蒙开发成为了前端工程师们提升自身竞争力的重要途径。那么&#xff0c;前端工程师如何才能快速入门鸿蒙开发呢? 一、了解鸿蒙开发的基础知识 前端工…

mybatis xml 动态sql相关语法

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace"com.xiaKangan.mapper.EmpMapper&qu…

定期修改密码竟然导致好几任运维小哥离职

某云服务商为政企客户提供私有云服务&#xff0c;每朵云里交换机、服务器、防火墙等网络/安全设备可多达数百台&#xff0c;而该企业仅有二、三十名运维人员&#xff0c;每人要负责2-3朵云的运维管理工作。当前&#xff0c;设备管理存在一些重大安全隐患&#xff0c;主要体现在…

微服务架构的未来发展趋势

文章目录 摘要引言当前发展趋势ServerlessService MeshAIOps 未来可能出现的挑战代码示例微服务架构示例 QA环节小结未来展望参考资料 摘要 微服务架构在软件开发中已经成为主流&#xff0c;但随着市场需求和技术环境的快速变化&#xff0c;微服务架构也在不断演进。本文将分析…

在线教育新突破:Codigger 视频会议的实战案例

在当今数字化时代&#xff0c;在线教育如同一颗璀璨的新星&#xff0c;迅速崛起并照亮了知识传播的新路径。然而&#xff0c;随着竞争的加剧&#xff0c;如何提升教学质量和增强互动性&#xff0c;成为了在线教育机构亟待解决的难题。这时候&#xff0c;视频会议的出现就如同一…