缓存三击-缓存穿透、缓存雪崩、缓存击穿

news2024/11/16 15:35:48

缓存三击-缓存穿透、缓存雪崩、缓存击穿

⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
笔记链接👉https://github.com/A-BigTree/Code_Learning
⭐⭐⭐⭐⭐⭐


Spring专栏👉https://blog.csdn.net/weixin_53580595/category_12279588.html

SpringMVC专栏👉https://blog.csdn.net/weixin_53580595/category_12281721.html

Mybatis专栏👉https://blog.csdn.net/weixin_53580595/category_12279566.html

如果可以,麻烦各位看官顺手点个star~😊

如果文章对你有所帮助,可以点赞👍收藏⭐支持一下博主~😆


文章目录

  • 缓存三击-缓存穿透、缓存雪崩、缓存击穿
    • 前言
    • 缓存雪崩
      • 概念
      • 分析
      • 解决方法
        • 过期时间设置随机值
        • 分布式部署且均匀分布热点数据
        • 热点数据永不过期
        • 兜底措施
      • 举例说明
    • 缓存击穿
      • 概念
      • 分析
      • 解决方法
        • 热点的key设置永不过期
        • 使用互斥锁
    • 缓存穿透
      • 概念
      • 分析
      • 解决方法
        • 缓存空对象
        • 使用布隆过滤器


前言

Redis作为目前使用最广泛的缓存,但在实际开发中会面临缓存异常,分别是缓存雪崩、缓存击穿和缓存穿透,这三种异常会导致大量请求从缓存转移到数据库,如果请求的并发量很大就会导致数据库崩溃。

缓存雪崩

概念

当某一个时刻出现大规模的缓存失效的情况,那么就会导致大量的请求直接打在数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。这时候如果运维马上又重启数据库,马上又会有新的流量把数据库打死。这就是缓存雪崩。

在这里插入图片描述

分析

造成缓存雪崩的关键在于在同一时间大规模的key失效。

出现这个问题有下面几种可能:

  • 第一种可能是Redis宕机;
  • 第二种可能是采用了相同的过期时间;

解决方法

过期时间设置随机值

在原有的失效时间上加上一个随机值,比如,1-5分钟随机。这样就避免了同一时间大量数据过期现象的发生而导致缓存雪崩。

分布式部署且均匀分布热点数据

如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。同时,分布式集群可以防止Redis宕机导致缓存雪崩的问题。

热点数据永不过期

设置热点数据永远不过期。

兜底措施

  1. 使用熔断机制。当流量到达一定的阈值时,就直接返回“系统拥挤”之类的提示,防止过多的请求打在数据库上。至少能保证一部分用户是可以正常使用,其他用户多刷新几次也能得到结果;
  2. 服务降级,当大量数据同时失效时,只允许核心数据请求访问数据库;
  3. 提高数据库的容灾能力,可以使用分库分表,读写分离的策略;
  4. 为了防止Redis宕机导致缓存雪崩的问题,可以搭建Redis集群,提高Redis的容灾性;

举例说明

比如,针对电商项目,一般是采取不同分类商品,缓存不同周期。在同一分类中的商品,加上一个随机因子。这样能尽可能分散缓存过期时间, 而且,热门类目的商品缓存时间长一些,冷门类目的商品缓存时间短一些,也能节省缓存服务的资源

其实集中过期,倒不是非常致命,比较致命的缓存雪崩,是缓存服务器某个节点宕机或断网。因为自然形成的缓存雪崩,一定是在某个时间段集中创建缓存,那么那个时候数据库能顶住压力,这个时候,数据库也是可以顶住压力的。无非就是对数据库产生周期性的压力而已。而如果因为缓存服务节点的宕机,对数据库服务器造成的压力是不可预知的,很有可能瞬间就把数据库压垮

缓存击穿

概念

一个热点key不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

分析

关键在于某个热点的key失效了,导致大并发集中打在数据库上。所以要从两个方面解决,第一是否可以考虑热点key不设置过期时间,第二是否可以考虑降低打在数据库上的请求数量。

解决方法

热点的key设置永不过期

从redis上看,确实没有设置过期时间,这就保证了,不会出现热点key过期问题,也就是“物理”不过期;

从功能上看,如果不过期,那不就成静态的了吗?所以我们把过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存的构建;

这种方法对于性能非常友好,唯一不足的就是构建缓存时候,其余线程(非构建缓存的线程)可能访问的是老数据,但是对于一般的互联网功能来说这个还是可以忍受。

使用互斥锁

大体思路就是只让一个线程构建缓存,其他线程等待构建缓存的线程执行完,重新从缓存获取数据就可以了,但性能很不好。

缓存穿透

概念

查询一个数据库一定不存在的数据。使用Redis大部分情况都是通过Key查询对应的值,假如发送的请求传进来的key是不存在Redis中的,那么就查不到缓存,查不到缓存就会去数据库查询。假如有大量这样的请求,这些请求像“穿透”了缓存一样直接打在数据库上,这种现象就叫做缓存穿透。

分析

正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。假如有恶意攻击,就可以利用这个漏洞,对数据库造成压力,甚至压垮数据库。

解决方法

缓存空对象

如果数据库查询对象为空,就缓存空对象,再次访问这个数据,就会从缓存中获取,以此保护后端数据源。如果缓存NULL,是做无用功,还是会造成缓存穿透。

缓存空对象遇到的两个问题:

  1. 如果是网络恶意攻击(每次key不一样,且数据库不存在),缓存占用了更多的内存;

解决方案:

缓存空对象要考虑到缓存时间的设置。这时候设置一个较短的过期时间(通常设定的缓存过期为60秒),就会自动剔除这些键。

  1. 如果过期时间设置的过大,数据库在此期间正好添加了该数据,就会出现数据不一致场景;

解决方案:

通过消息系统或者其它方式来清除缓存中的空对象。

使用布隆过滤器

布隆过滤器的作用是某个 key 不存在,那么就一定不存在,它说某个 key 存在,那么很大可能是存在(存在一定的误判率)。于是我们可以在缓存之前再加一层布隆过滤器,在查询的时候先去布隆过滤器查询 key 是否存在,如果不存在就直接返回。

  • 布隆缓存器详细介绍👉缓存穿透-布隆缓存器

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

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

相关文章

【产品设计】掌握“4+X”模型,从0到1构建B端产品

“4X”模型是什么 4个阶段:规划阶段,设计阶段,实现阶段,迭代阶段 X:项目管理,数据分析,产品运营 1、规划阶段 这是一个产品的开始,它决定了产品的设计方向和基调。主要包括用户分析、市场分…

爬虫入门指南(4): 使用Selenium和API爬取动态网页的最佳方法

文章目录 动态网页爬取静态网页与动态网页的区别使用Selenium实现动态网页爬取Selenium 的语法及介绍Selenium简介安装和配置创建WebDriver对象页面交互操作 元素定位 等待机制页面切换和弹窗处理截图和页面信息获取关闭WebDriver对象 使用API获取动态数据未完待续.... 动态网页…

JVM-垃圾回收-基础知识

基础知识 什么是垃圾 简单说就是没有被任何引用指向的对象就是垃圾。后面会有详细说明。 和C的区别 java:GC处理垃圾,开发效率高,执行效率低 C:手工处理垃圾,如果忘记回收,会导致内存泄漏问题。如果回…

Linux Mint 21.2“Victoria”Beta 发布

导读近日消息,Beta 版 Linux Mint 21.2 “Victoria” 于今天发布,用户可以访问官网下载镜像。 Linux Mint 21.2 代号 “Victoria” ,基于 Canonical 长期支持的 Ubuntu 22.04 LTS(Jammy Jellyfish)操作系统&#xff0…

2023年第三届工业自动化、机器人与控制工程国际会议

会议简介 Brief Introduction 2023年第三届工业自动化、机器人与控制工程国际会议(IARCE 2023) 会议时间:2023年10月27 -30日 召开地点:中国成都 大会官网:www.iarce.org 2023年第三届工业自动化、机器人与控制工程国际…

JAVA http

javahttp 请求数据格式servletservlet生命周期servletrequest获取请求数据解决乱码response相应字符&字节数据 请求数据格式 servlet servlet生命周期 servlet request获取请求数据 解决乱码 response相应字符&字节数据 response.setHeader("content-type",…

A. Portal(dp优化枚举)

Problem - 1580A - Codeforces CQXYM发现了一个大小为nm的矩形。矩形由n行m列的方块组成,每个方块可以是黑曜石方块或空方块。CQXYM可以通过一次操作将黑曜石方块变为空方块,或将空方块变为黑曜石方块。 一个大小为ab的矩形M被称为传送门,当…

【Linux】程序员的基本素养学习

这是目录 写在前面一、内存管理1、分段2、分页 二、线程管理三、静态库1、编译1.1、预处理1.2、编译1.3、汇编1.4、链接2、编译器3、目标文件**.text****.data****.bss****__attribute__** 3.1、符号3.2、兼容C语言 -- extern C4、链接 -- ld 写在前面 本文记录自己的学习生涯…

五.组合数据类型

目录 1、数组类型 声明数组 初始化数组 数组赋值 访问数组元素 2、切片类型 1、定义切片 2、切片初始化 3、访问 4、空(nil)切片 5、切片的增删改查操作: 3、指针类型 1、什么是指针 2、如何使用指针、指针使用流程: 3、Go 空指针 4、指…

chatgpt赋能python:如何将Python打包-一个SEO优化指南

如何将Python打包 - 一个SEO优化指南 作为一名拥有10年Python编程经验的工程师,我意识到很多Python开发者面临一个共同的问题:如何将他们的Python项目打包并发布到PyPI上?打包一个Python项目不仅可以让您的代码更加组织化,也可以…

如何拆分PDF?拆分PDF软件分享!​

那么如何拆分PDF?PDF是一种流行的电子文档格式,它可以在不同的操作系统和设备上进行查看和共享,而不会因为不同的软件或硬件而出现兼容性问题。同时,在使用的过程中,PDF拆分PDF文件是一个比较常见的需求,它…

threejs入门

个人博客地址: https://cxx001.gitee.io 前言 随着HTML5的发布,我们可以通过WebGL在浏览器上直接使用显卡资源来创建高性能的二维和三维图形,但是直接使用WebGL编程来创建三维场景十分复杂而且还容易出问题。而使用Three.js库可以简化这个过程&#xff…

机器学习——决策树1(三种算法)

要开始了…内心还是有些复杂的 因为涉及到熵…单纯的熵,可以单纯 复杂的熵,如何能通俗理解呢… 我也没有底气,且写且思考吧 1. 决策树分类思想 首先,决策树的思想,有点儿像KNN里的KD树。 KNN里的KD树,是每…

如何将非平稳的时间序列变为平稳的时间序列?

可以采用现代信号处理算法,比如小波分解,经验模态分解,变分模态分解等算法。 以经济金融领域的数据为例,经济金融领域的数据作为一种时间序列,和我们平常工程领域分析的信号具有相同特性。一般来说,信号是…

在 Maya、ZBrush 和 Arnold 中重塑来自邪恶西部的 Edgar Gravenor

今天瑞云渲染小编给大家带来Giancarlo Penton 介绍的Edgar Gravenor项目背后过程,展示了皮肤纹理和头发是如何制作的,并解释了详细的服装是如何设置的。 介绍 大家好,我的名字是Giancarlo Penton。我是一名3D角色艺术家,最近毕业…

从零开始 Spring Boot 53:JPA 属性转换器

从零开始 Spring Boot 53:JPA 属性转换器 图源:简书 (jianshu.com) 这篇文章介绍如何在 JPA(Hibernate)中使用属性转换器。 在前篇文章中,我介绍了如何使用Embedded和Embeddable将一个类型嵌入实体类,并映…

初识mysql之表内容的增删查改

目录 一、插入 1. 插入基础语法 2. 单行数据 全列插入 3. 多行数据 全列插入 4. 插入,失败则更新 5. 替换 二、基础查询 1. 查询基础语法 2. 全列查询 3. 指定列查询 4. 表达式查询 5. 结果去重 6. where条件 6.1 比较运算符与逻辑运算符 6.2 查询…

爬虫入门指南(5): 分布式爬虫与并发控制 【提高爬取效率与请求合理性控制的实现方法】

文章目录 前言多线程与多进程多线程多进程多线程和多进程的选择 使用Scrapy框架实现分布式爬虫1. 创建Scrapy项目2. 配置Scrapy-Redis3. 创建爬虫4. 启动爬虫节点5. 添加任务到队列 并发控制与限制请求频率并发控制限制请求频率 未完待续... 前言 在进行爬虫任务时,…

STM32外设系列—红外遥控

文章目录 一、红外遥控简介二、红外遥控的原理三、二进制脉冲编码3.1 NEC码的位定义3.2 NEC遥控指令的数据格式 四、红外遥控程序设计思路五、红外遥控程序设计5.1 红外遥控初始化程序5.2 记录高电平持续时间函数5.3 中断服务函数5.4 读取键值5.5 参数定义 六、应用实例 一、红…

ADB原理,常用命令汇总及示例

一. ADB简介 ADB,即 Android Debug Bridge 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种…