缓存雪崩 详解
缓存雪崩详解
缓存雪崩是分布式系统中一种常见的问题,它指的是缓存中大量数据在同一时间失效,导致所有的请求都直接涌向数据库或后端服务,进而导致系统负载骤增,甚至引发系统宕机或崩溃。
1. 缓存雪崩的原因
缓存雪崩通常由以下几种情况引发:
-
缓存大面积过期:
- 缓存中大量的数据设置了相同或接近的过期时间,在某一时刻同时失效。
- 所有请求在失效后直接涌向后端数据库或服务。
-
缓存服务器故障:
- 缓存服务(如 Redis、Memcached)崩溃或不可用,导致缓存中的数据全部丢失。
-
集中重建缓存:
- 某些热点数据在缓存失效后被大量并发请求触发,同时去后端重新加载并更新缓存。
-
高并发流量:
- 在高并发情况下,缓存击穿进一步加剧了后端压力,可能导致雪崩效应。
2. 缓存雪崩的危害
-
后端服务压力骤增:
- 大量请求涌向数据库或其他后端服务,系统负载急剧上升,可能导致服务不可用。
-
请求大量超时或失败:
- 用户请求因后端服务响应慢或拒绝服务而失败,严重影响用户体验。
-
连锁反应:
- 后端服务因过载而宕机,可能波及其他服务,最终导致整个系统崩溃。
3. 缓存雪崩与相关问题的对比
缓存击穿
- 定义:单个热点数据的缓存失效,大量请求直接打到后端。
- 特点:影响范围较小,集中在某个热点数据上。
- 解决方法:使用互斥锁、永不过期策略等。
缓存雪崩
- 定义:大面积缓存同时失效,大量请求涌向后端。
- 特点:影响范围大,可能导致系统全面崩溃。
- 解决方法:过期时间分布化、降级保护等。
缓存穿透
- 定义:大量请求查询数据库中不存在的数据,缓存无法命中。
- 特点:对缓存无直接作用,但后端数据库压力大。
- 解决方法:布隆过滤器、缓存空值等。
4. 缓存雪崩的解决方案
4.1 避免大规模缓存同时过期
-
设置随机过期时间
- 在每个缓存的过期时间基础上加上一个随机值。
- 例如:
EXPIRE = 60 + Random(0, 10)
。 - 这样可以避免缓存数据在某一时刻集中失效。
-
缓存分区策略
- 将缓存划分为多个区域,根据访问频率、业务逻辑等分开设置过期时间。
4.2 限流与降级
-
请求限流
- 在缓存失效时,对请求数量进行限制,防止过多请求直接打到数据库。
- 常用技术:
- 令牌桶:限制一定时间内的请求总量。
- 漏桶算法:控制请求处理的平均速率。
-
服务降级
- 在缓存失效或后端服务不可用时,返回默认值或空值,保证服务的可用性。
- 例如:
- 对非核心功能直接返回“服务暂不可用”。
- 提供静态页面或缓存的旧数据。
4.3 增强缓存的高可用性
-
分布式部署
- 使用分布式缓存(如 Redis Cluster),避免单点故障。
- 数据分片存储,提升系统的容灾能力。
-
主从架构与哨兵机制
- Redis 的主从复制和哨兵模式可以提高缓存服务的容错能力。
- 主节点故障时,从节点可快速切换为主节点。
4.4 缓存重建优化
-
热点数据预热
- 在系统启动或缓存失效前,提前将热点数据加载到缓存中。
- 例如:部署脚本提前预热常用的数据。
-
异步更新缓存
- 将大量缓存更新操作放入消息队列中异步执行,避免瞬时高并发打爆数据库。
-
锁机制控制重建
- 在热点数据失效时,通过分布式锁限制多个线程同时重建缓存。
- 示例(Redis 加锁机制):
if (redis.get("key") == null) {if (lock.tryLock()) {// 重新加载数据并更新缓存redis.set("key", db.query());} }
4.5 动态扩容
-
增加缓存节点
- 在流量高峰期,动态增加缓存节点,分担缓存压力。
-
数据库读写分离
- 在缓存失效时,通过读写分离减轻主库压力。
5. 缓存雪崩的具体实践
Redis 应用场景中的优化
-
设置缓存过期时间分散化
- 在业务中为不同的 key 设置不同的过期时间,并加入随机化处理:
redis.setex("key", ttl + new Random().nextInt(300), value);
- 在业务中为不同的 key 设置不同的过期时间,并加入随机化处理:
-
引入热点数据预热机制
- 在系统启动后,主动将高频访问的数据提前加载到缓存中。
- 实现方式:通过定时任务或脚本自动加载。
-
使用集群和高可用部署
- Redis Cluster + 哨兵模式,保证缓存服务的高可用性。
6. 总结
核心问题
缓存雪崩的核心问题是大量缓存失效时,数据库或后端服务无法承受流量骤增带来的压力。
解决思路
- 预防性措施:随机过期时间、分布式缓存等。
- 保护性措施:限流降级、缓存预热。
- 高可用性设计:分布式缓存架构、异步更新、动态扩容。
最佳实践
- 在设计缓存时,不仅要考虑缓存命中率,还要为缓存失效的极端情况预留解决方案。
- 利用分布式缓存的高可用特性,降低缓存故障的风险。
- 在高并发系统中,结合限流、降级等技术保证系统的稳定性。
通过以上措施,可以有效防止缓存雪崩对系统的冲击,提升分布式系统的健壮性和可靠性。
相关文章:
缓存雪崩 详解
缓存雪崩详解 缓存雪崩是分布式系统中一种常见的问题,它指的是缓存中大量数据在同一时间失效,导致所有的请求都直接涌向数据库或后端服务,进而导致系统负载骤增,甚至引发系统宕机或崩溃。 1. 缓存雪崩的原因 缓存雪崩通常由以下…...
使用 Vite 创建 Vue3+TS 项目并整合 ElementPlus、Axios、Pinia、Less、Vue-router 等组件或插件
前言 记录一下使用 Vite 创建 Vue3TS 项目并整合 ElementPlus、Axios、Pinia、Less、Vue-router 等组件或插件。 一、使用 Vite 创建 Vue3TS 项目 1.新建一个 temp 文件夹 (1)在桌面新建一个 temp 文件夹,然后在 VS Code 中打开此文件夹&…...
Flink随笔 20241203 Flink重点内容
Flink 是一个强大的流处理框架,它的设计理念是高吞吐量、低延迟的流式计算。你提到的这些重点是 Flink 的核心组成部分,下面我将详细解析每一个方面。 1. 窗口(Window) 窗口是 Flink 流处理中一个非常重要的概念,主要…...

shell脚本实战
学习视频来自B站UP主泷羽sec,如涉及侵权马上删除文章。 笔记只是方便学习,以下内容只涉及学习内容,切莫逾越法律红线。 安全见闻,包含了各种网络安全,网络技术,旨在明白自己的渺小,知识的广博&a…...
【机器学习】分类任务: 二分类与多分类
二分类与多分类:概念与区别 二分类和多分类是分类任务的两种类型,区分的核心在于目标变量(label)的类别数: 二分类:目标变量 y 只有两个类别,通常记为 y∈{0,1} 或 y∈{−1,1}。 示例ÿ…...
FreeSWITCH mod_conference 的按键会控
又是一篇命题作文 mod_conference 官方文档: https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod_conference_3965534/ 英文不好的可以看中文: http://www.freeswitch.org.cn/books/references/1.7-mod_conference.html…...

串口工作方式
串口工作方式 方式0方式0输出方式0输入 方式1方式1输出方式1输入 方式2或方式3输出输入 串口使用方法如何计算波特率串口初始化步骤串口回传实验模拟printf实验串口接收数据不丢失实验 方式0 方式 0 时,串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输 入…...
统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现
要统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现。以下是一些常见的方法和步骤: 一、通过命令行工具统计 查看Nginx访问日志: Nginx的访问日志通常默认存储在/var/log/nginx/access.log,但具体位置可能因安装和配置…...

Apache Airflow 快速入门教程
Apache Airflow已经成为Python生态系统中管道编排的事实上的库。与类似的解决方案相反,由于它的简单性和可扩展性,它已经获得了普及。在本文中,我将尝试概述它的主要概念,并让您清楚地了解何时以及如何使用它。 Airflow应用场景 …...

42 基于单片机的智能浇花系统
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,采样DHT11温湿度传感器检测温湿度,通过LCD1602显示 4*4按键矩阵可以设置温度湿度阈值,温度大于阈值则开启水泵,湿度大于阈值则开启风扇…...
乐橙云小程序插件接入HbuilderX
乐橙插件使用: 1.配置app.json文件,uniapp中在mainfest.json中配置 https://uniapp.dcloud.net.cn/collocation/manifest.html#mp-weixin ** 2、集成插件页面.json文件 ** uniapp在 pages.json 对应页面的 style -> usingComponents 引入组件&…...
VoCo-LLaMA: Towards Vision Compression with Large Language Models
视觉语言模型在各种多模态任务上取得了显著的成功,但经常受到有限上下文窗口和处理高分辨率图像输入和视频的高计算成本的瓶颈。视觉压缩可以通过减少视觉令牌数量避免该问题。先前方法使用额外模块压缩视觉令牌并强制LLM理解压缩的令牌。然而,LLM对视觉…...

Vue+vite 组件开发的环境准备
一.nodejs安装 进入Node.js 官网(Node.js — Run JavaScript Everywhere),点击下载。 双击打开,进行安装 双击打开后,点击 next(下一步),后面也是一直点击 next 无其他设置,直到 …...

基于社区发现的GraphRAG思路
GraphRAG出自2024年4月的论文《From Local to Global: A Graph RAG Approach to Query-Focused Summarization》,其代码也在2024年年中开源 。它在用图结构来完成RAG时,使用社区这个概念并基于社区摘要来回答一些概括性的问题。 Graph RAG流程如论文图1所…...
react学习记录
一、目录结构react优秀代码之react目录结构简洁之道React 作为一个库,不会决定你如何组织项目的结构。这是件好事,因为这样 - 掘金【React】项目的目录结构全面指南_react项目结构-CSDN博客 1、创建项目:开发文档 Getting Started | Create…...

Day2——需求分析与设计
教师端签到应用软件的需求分析; 产品经理如何写好产品需求文档(附模板) 需求分析是软件开发过程中的关键步骤,它确保了开发的软件能够满足用户的需求。以下是进行需求分析的具体步骤: 1. 确定分析目标 明确教师端签到…...

VScode离线下载扩展安装
在使用VScode下在扩展插件时,返现VScode搜索不到插件,网上搜了好多方法,都不是常规操作,解决起来十分麻烦,可以利用离线下载安装的方式安装插件!亲测有效!!! 1.找到VScod…...

【机器学习】机器学习的基本分类-监督学习-决策树(Decision Tree)
决策树是一种树形结构的机器学习模型,适用于分类和回归任务。它通过一系列基于特征的条件判断来将数据分割为多个子区域,从而预测目标变量的值。 1. 决策树的结构 根节点(Root Node) 决策树的起点,包含所有样本。根据某…...

【第 1 章 初识 C 语言】1.8 使用 C 语言的 7 个步骤
目录 1.8 使用 C 语言的 7 个步骤 1.8.1 第 1 步:定义程序的目标 1.8.2 第 2 步:设计程序 1.8.3 第 3 步:编写代码 1.8.4 第 4 步:编译 1.8.5 第 5 步:运行程序 1.8.6 第 6 步:测试和调试程序 1.8.…...
Docker 使用 Dockerfile 文件打包部署前端项目
编写 Dockerfile 文件: FROM nginx:latest ADD dist /etc/nginx/html/dist COPY nginx.conf /etc/nginx/nginx.conf ENV PATH /usr/sbin:$PATH EXPOSE 80 ENTRYPOINT ["nginx"] CMD ["-g","daemon off;"]编写 nginx.conf 文件&#…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...