Redis 缓存深度解析:穿透、击穿、雪崩与预热的全面解读

Redis 缓存深度解析:穿透、击穿、雪崩与预热的全面解读

  • 一 . 什么是缓存 ?
  • 二 . 使用 Redis 作为缓存
  • 三 . 缓存的更新策略
    • 3.1 定期生成
    • 3.2 实时生成
  • 四 . 缓存预热、缓存穿透、缓存雪崩、缓存击穿
    • 4.1 缓存预热
    • 4.2 缓存穿透
    • 4.3 缓存雪崩
    • 4.4 缓存击穿

Hello , 大家好 , 这个专栏给大家带来的是 Redis 系列 ! 本篇文章给大家讲解的是 Redis 的缓存. 在 Redis 缓存系统中 , 缓存穿透、缓存击穿、缓存雪崩和缓存预热是常见的问题 , 它们对系统的性能和稳定性有着重要的影响 . 而缓存穿透、缓存击穿、缓存雪崩和缓存预热又是面试常考问题 , 所以大家一定要仔细认真的阅读 !

在这里插入图片描述
本专栏旨在为初学者提供一个全面的 Redis 学习路径,从基础概念到实际应用,帮助读者快速掌握 Redis 的使用和管理技巧。通过本专栏的学习,能够构建坚实的 Redis 知识基础,并能够在实际学习以及工作中灵活运用 Redis 解决问题 .
专栏地址 : Redis 入门实践

一 . 什么是缓存 ?

Redis 最主要的用途主要有三个方面 :

  1. 存储数据 (内存型数据库)
  2. 缓存 (最常用的场景)
  3. 消息队列 (使用比较少)

缓存的作用就是让我们能够更快地获取到数据 , 一般来说速度快的设备可以给速度慢的设备去做缓存 .

对于硬件的访问速度来说 , 通常情况下是这样的 : CPU 寄存器 > 内存 > 硬盘 > 网络

比较常见的是使用内存来去作为硬盘的缓存 (Redis) , 甚至我们也可以使用硬盘来去作为网络的缓存

使用硬盘来去作为网络的缓存这种场景也是存在的 , 比如 : 浏览器的缓存 , 浏览器通过 HTTP/HTTPS 从服务器上获取到数据 (HTML / CSS / JS / 图片 / 视频 / 音频 / 字体 …) 并且进行展示 , 那像这些体积大而且变化不频繁的数据就可以保存到浏览器本地 , 这就是使用硬盘来去给网络做缓存 .

二 . 使用 Redis 作为缓存

在一个网站中 , 我们通常会使用 Redis 来去作为关系型数据库 (MySQL) 的缓存

为什么一般来说关系型数据库性能都不高 ?

  1. 关系型数据库把数据存储到硬盘上 , 但是硬盘的 IO 速度并不快 , 尤其是随机访问
  2. 如果查询不能命中索引 , 就需要进行表的整个遍历 , 这样就会大大增加硬盘的 IO 次数
  3. 关系型数据库对于 SQL 的执行会做一系列的解析、校验、优化工作
  4. 一些复杂查询 (比如 : 笛卡尔积操作) 效率也会降低

由于关系型数据库效率一般比较低 , 所以能够承担的并发量有限 . 一旦请求数量变多 , 数据库的压力就会变大 , 甚至严重到宕机 .

那如何提高 MySQL 能够承担的并发量呢 ?

  1. 开源 : 引入更多的机器 , 构成数据库集群
  2. 节流 : 引入缓存就是一种节流的方案 , 把一些频繁读取的热点数据保存到缓存中 , 后续查询数据 , 如果缓存中存在就直接返回

三 . 缓存的更新策略

如何知道 Redis 中应该存储哪些数据呢 ? 也就是如何知道哪些数据属于热点数据呢 ?

那我们需要先了解一下缓存的更新策略

3.1 定期生成

首先我们会把访问的数据以日志的形式记录下来 .

通过日志 , 就可以把访问的数据记录下来 , 然后针对这些日志进行统计 , 按照一段时间内数据出现的频率进行降序排序 , 然后排名靠前的数据就可以认为是热点数据 .

那这个热点数据 , 就可以根据当前的统计维度 (每 天/周/月) 来定期更新 , 我们可以写一套离线的流程 (比如使用 Shell / Python … 来去写一些脚本代码) 来进行定时任务的触发 .

这种方式的优点是上述过程实现比较简单 , 过程更可控 , 方便排查问题

那缺点也很明显 , 它的实时性不够 , 如果出现一些突发事件 , 导致一些本来不是热词的内容变成了热词了

比如 : 春晚这个关键词 , 如果定期生成的话 , 假如周期是一个月 , 那年都过完了 , 春晚这个热搜才被统计出来

3.2 实时生成

实时生成的策略是 :

  • 如果在 Redis 中查询到数据 , 就直接返回数据
  • 如果在 Redis 中查询不到数据 , 那就把查询到的结果也写入到 Redis 中

但是这样不停地写 Redis , 就会使 Redis 的内存占用越来越多 , 从而逐渐的达到内存上限

此时如果继续插入数据 , 就会出现一些问题 , 为了解决上述情况 , Redis 就引入了一些内存淘汰策略

  1. 先进先出 (FIFO - First In First Out) : 将缓存中存在时间最久的数据 (最先来的数据) 淘汰掉
  2. 淘汰最久未使用的 (LRU - Least Recently Used) : 记录每个 key 的最近访问时间 , 将最近访问时间最老的 key 淘汰掉
  3. 淘汰访问次数最少的 (LFU - Least Frequently Used) : 记录每个 key 最近一段时间的访问次数 , 把访问次数最少的淘汰掉
  4. 随机淘汰 (Random) : 从所有的 key 中随机抽取某个 key 然后淘汰掉

在 Redis 中有一个配置项 , 就可以设置 Redis 采取哪种内存淘汰策略

  1. LRU 策略 (最近最少使用)
    1. volatile-lru : 从设置了过期时间的 key 中使用 LRU 算法进行淘汰
    2. allkeys-lru : 从所有 key 中使用 LRU 算法进行淘汰
  2. LFU 策略 (最近访问最少)
    1. volatile-lfu : 在已经过期的 key 中使用 LFU 算法进行淘汰
    2. allkeys-lfu : 从所有 key 中使用 LFU 算法进行淘汰
  3. Random (随机淘汰)
    1. volatile-random : 从设置了过期时间的 key 中随机淘汰数据
    2. allkeys-random : 从所有 key 中随机淘汰数据
  4. FIFO (先进先出)
    1. volatile-ttl : 根据过期时间进行淘汰 , 越早过期的越先被淘汰 (相当于 FIFO , 只不过是针对过期的 key)
  5. noeviction 默认策略 : 当内存不⾜以容纳新写⼊数据时 , 新写入操作会报错 .

经过一段时间的动态平衡 , Redis 中的 key 就都逐渐成了热点数据了

四 . 缓存预热、缓存穿透、缓存雪崩、缓存击穿

4.1 缓存预热

我们之前了解过 , 缓存中的数据有两种更新策略

  1. 定期生成 : 这种情况一般不涉及缓存预热问题
  2. 实时生成 : 一般涉及到缓存预热文体

在 Redis 服务器首次接入之后 , Redis 服务器中是没有任何数据的 . 而实时生成的步骤是客户端先查询 Redis 的数据 , 如果没查到就再查一次 MySQL , 然后将查询到的数据也写入到 Redis 中 .

这样的话 , 在服务器刚启动的时候 , 所有的请求都会访问 MySQL , 就会给 MySQL 造成不小压力 . 随着时间的推移 , Redis 上面积累的数据越来越多 , MySQL 的压力就会越来越小 .

所以我们就需要在服务器刚启动的时候进行缓存预热 , 避免服务器刚启动的时候导致 MySQL 压力过大 .

缓存预热的步骤是将定期生成和实时生成相结合 , 通过离线的方式用一些统计途径 , 先把热点数据找到一批然后导入到 Redis 中 . 此时导入的这些热点数据就能够减轻 MySQL 很大压力了 , 随着时间的推移 , 逐渐就可以使用新的热点数据淘汰掉旧的数据了 .

4.2 缓存穿透

缓存穿透指的是查询的某个 key , 他在 Redis 中查询不到 , 在 MySQL 中也查询不到 , 那这个 key 肯定也不会被更新到 Redis 中 .

那如果这样的数据存在很多并且还反复查询 , 一样也会给 MySQL 带来很大压力 .

一般来说 , 出现这样的情况主要有以下几个原因 :

  1. 业务设计不合理 : 比如缺少一些参数校验环节 , 导致非法的 key 也进行查询了
  2. 开发 / 运维误操作 : 不小心把部分数据删除掉了
  3. 黑客恶意攻击

我们通过改进业务 / 加强监控报警这些方法 , 虽然能够解决 , 不过是亡羊补牢 .

一般来说 , 主要采用的方案有以下几种 :

  1. 如果发现某个 key 在 Redis 和 MySQL 中都不存在 , 那将这个 key 写入到 Redis 中 , 然后将 value 设置成一个非法值 (比如 : “”)
  2. 引入布隆过滤器 : 在每次查询 Redis / MySQL 之前 , 都需要先判定一下 key 是否在布隆过滤器中是否存在 (我们会提前将所有的 key 插入到布隆过滤器中) .

布隆过滤器本质上是结合了 hash + bitmap 这两种结构 , 以较小的空间开销和较快的时间速度 , 实现针对 key 是否存在的判定

4.3 缓存雪崩

缓存雪崩指的是由于在短时间内 , Redis 上大规模的 key 失效 , 导致缓存命中率陡然下降 , 导致 MySQL 压力迅速上升 , 甚至宕机 .

产生这种情况主要有以下几种原因 :

  1. Redis 直接挂了 : Redis 宕机 / Redis 集群模式下大量节点宕机
  2. 之前短时间内设置了很多 key 给 Redis , 并且设置的过期时间是相同的 : 给 Redis 设置 key 作为缓存的时候 , 有的时候为了考虑缓存的时效性 , 就会设置过期时间 , 并且它是和 Redis 的内存淘汰机制是相配合使用的

那解决的原因一般如下 :

  1. 加强监控报警 , 加强 Redis 集群可用性
  2. 不给 key 设置过期时间 , 或者设置过期时间添加随机因子 (防止同一时刻过期)

4.4 缓存击穿

缓存击穿的英文全称指的是 Cache breakdown , 其中 breakdown 更适合翻译成瘫痪

所以缓存击穿我们就可以理解为缓存瘫痪 , 他是缓存雪崩的特殊情况 , 针对热点 key , 突然过期了 , 这样就导致了大量的请求直接访问到数据库上 , 甚至引起数据库宕机 .

它的解决方案主要有以下几点 :

  1. 基于统计的方式发现一些非常热点的 key , 并且设置永不过期 : 这需要服务器结构做出较大的调整 , 专门设置一个方法来去统计
  2. 进行必要的服务降级 : 例如访问数据库的时候使用分布式锁 , 限制服务器同时请求数据库的并发数

服务降级指的就是本身我们服务器的功能有 10 个 , 但是在一些特定情况下适当的关闭一些不重要的功能 , 只保留一些核心的功能 (超级省电模式 , 只保留了电话、短信、相机等核心功能)


文章到这里就结束喽 , 不知道你有没有被缓存预热、缓存穿透、缓存雪崩、缓存击穿绕蒙 , 如果对你有帮助的话 , 还请一键三连 , 你的鼓励是对我最大的认可~
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebAPI (一)DOM树、DOM对象,操作元素样式(style className,classList)。表单元素属性。自定义属性。间歇函数定时器

文章目录 Web API基本认知一、 变量声明二、 DOM1. DOM 树2. DOM对象3. 获取DOM对象(1)、选择匹配的第一个元素(2)、选择匹配多个元素 三、 操作元素1. 操作元素内容2. 操作元素属性(1)、常用属性(href之类的)(2)、通过style属性操作CSS(3)、通过类名(cl…

wireshark安装及抓包新手使用教程

Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程各种问题定位。本文主要内容包括: 1、Wireshark软件下载和安装以及Wireshark主界面介绍。 2、WireShark简单抓包示例。通过该例子学…

Ollama—87.4k star 的开源大模型服务框架!!

这一年来,AI 发展的越来越快,大模型使用的门槛也越来越低,每个人都可以在自己的本地运行大模型。今天再给大家介绍一个最厉害的开源大模型服务框架——ollama。 项目介绍 Ollama 是一个开源的大语言模型(LLM)服务工具…

IDM 工具下载 地图高程数据

巧用IDM工具 快捷下载ASTER GDEM v3高程数据 ASTER GDEM v3是NASA推出的30米高清DEM,覆盖了几乎全部的地球陆地。那么,在NASA官网怎么下载ASTER GDEM v3的地形高程数据呢? 首先,你需要注册一个nasa的账号 注册网址: https://urs.earthdata.nasa.gov/users/new 注册方式和国…

基于人工智能的聊天情感分析系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 情感分析是一种自然语言处理任务,旨在识别文本中的情感,如“积极”、“消极”或“中立”。在聊天应用中&#…

iPhone手机清理软件:照片清理功能全解析

在数字化生活中,智能手机成为我们记录生活点滴的主要工具,尤其是iPhone,以其卓越的相机功能备受用户青睐。然而,成千上万的照片迅速堆积,不仅占用了大量存储空间,还使得设备运行缓慢。在众多解决方案中&…

多环境jdk安装,CentOS,统信UOS,Ubuntu,KylinOS,windows

文章目录 1.CentOS1.1yum安装1.2压缩包安装 本文档只是为了留档方便以后工作运维,或者给同事分享文档内容比较简陋命令也不是特别全,不适合小白观看,如有不懂可以私信,上班期间都是在得 1.CentOS 1.1yum安装 yum install -y jav…

【pyhton】python如何实现将word等文档中的文字转换成语音

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

【TomCat】安装部署

首先得进行Java的安装和部署java1.8对应tomcat9 TomCat下载Apache Tomcat - Apache Tomcat 10 Software Downloads

Verilog和Matlab实现RGB888互转YUV444

文章目录 一、色彩空间1.1 RGB色彩空间1.2 CMYK色彩空间1.3 YUV色彩空间 二、色彩空间转换公式2.1 RGB转CMYK2.2 CMYK转RGB2.3 RGB888转YUV4442.4 YUV444转RGB888 三、MATLAB实现RGB888转YUV4443.1 matlab代码3.2 matlab结果 四、Verilog实现RGB888转YUV444 一、色彩空间 色彩空…

【Python】数据可视化之分类图

目录 条形图 箱形图 散点图 分簇散点图 小提琴 分簇小提琴 条形图 条形图是一种直观的图表形式,它通过不同长度的矩形条(即“条形”)来展示数值变量的中心趋势估计值,其中每个矩形的高度直接对应于该组数据的某个中心量度&…

2024 年高教社杯全国大学生数学建模竞赛B题第三问详细解题思路(终版)

示例代码: import numpy as np import pandas as pd# 参数设定 params {m: 8, # 零配件数量n: 2, # 半成品数量p: [0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10], # 零配件次品率c: [2, 8, 12, 2, 8, 12, 8, 12], # 购买单价d: [1, 1, 2, 1, 1, 2, 1, 2]…

《python语言程序设计》第8章第12题生物信息:找出基因,生物学家使用字母A C T和G构成字符2串建模一个基因组(上)

草稿一、用单一方法遍历文本 9.1代码 genome_text TTATGTTTTAAGGATGGGGCGTTAGTTdef div_word(word_to_judge):len_num len(word_to_judge)save_word ""if len_num % 3 0:print("This word is valid")if save_word.find("ATG") "ATG&qu…

以太网--TCP/IP协议(二)

上文中讲述了IP协议,本文主要来讲一下TCP协议。 TCP协议 (1)端到端通信 直接把源主机应用程序产生的数据传输到目的主机使用这 些数据的应用程序中,就是端到端通信。 (2)传输层端口 公认端口&#xff0…

统计学习方法与实战——统计学习方法之感知机

感知机 感知机三要素分析模型策略损失函数选择 算法原始形式对偶形式 相关问题 例子iris数据集分类实战数据集查看 显示结果sklearn 实战感知机 习题解答习题2.1解题步骤反证法 习题2.2习题2.3凸壳线性可分线性可分证明凸壳不相交证明充分性:凸壳不相交\Rightarrow⇒…

【优化】Nginx 配置页面请求不走缓存 浏览器页面禁用缓存

【优化】Nginx 配置页面请求不走缓存 禁用缓存 目录 【优化】Nginx 配置页面请求不走缓存 禁用缓存 对所有请求禁用缓存 对特定location禁用缓存 注意事项 全局禁用缓存 要配置Nginx使其不缓存内容,通常是指禁止浏览器缓存响应的内容,或者是在代理…

Java语言程序设计基础篇_编程练习题**17.21 (十六进制编辑器)

目录 题目:**17.21 (十六进制编辑器) 代码示例 结果展示 题目:**17.21 (十六进制编辑器) 编写一个 GUI 应用程序,让用户在文本域输入一个文件名,然后按回车键,在文本域显示它的十六进制表达形式。用户也可以修改十六…

HarmonyOS 是如何实现一次开发多端部署

一次开发多端部署遇到的几个关键问题 为了实现“一多”的目标,需要解决如下三个基础问题: 问题1:页面如何适配 不同设备间的屏幕尺寸、色彩风格等存在差异,页面如何适配。 问题2:功能如何兼容 不同设备的系统能力…

glsl着色器学习(九)屏幕像素空间和设置颜色

在上一篇文章中,使用的是裁剪空间进行绘制,这篇文章使用屏幕像素空间的坐标进行绘制。 上一篇的顶点着色器大概是这样子的 回归一下顶点着色的主要任务: 通常情况下,顶点着色器会进行一系列的矩阵变换操作,将输入的顶…

【笔记-流程记录】从零开始做一个人形怪兽(建模阶段)

大型 1.第一步还是找素模,打开材质球,吸管点一下,就会出现素模的贴图,一共有四个 比如,点进去第一个,再点漫反射,再点psd就会得到相应的贴图 2.然后我们依然是面片然后插入参考图 如果透视窗口…