Redis 缓存穿透、击穿、雪崩:问题与解决方案
在使用 Redis 作为缓存中间件时,系统可能会面临一些常见的问题,如 缓存穿透、缓存击穿 和 缓存雪崩。这些问题如果不加以解决,可能会导致数据库压力过大、系统响应变慢甚至崩溃。本文将详细分析这三种问题的起因,并提供有效的解决方案及其优缺点。
一、缓存穿透(Cache Penetration)
问题描述:
恶意请求查询数据库中不存在的数据,导致请求直接穿透缓存层直达数据库。当高并发发生时,可能压垮数据库。
解决方案对比
| 解决方案 | 实现方式 | 优点 | 缺点 |
|---|---|---|---|
| 布隆过滤器 | 使用位数组存储所有可能存在的key哈希值 | 内存占用极小(亿级数据约百MB) | 存在误判率(可配置0.1%-1%),不支持删除操作 |
| 空值缓存 | 对不存在的数据缓存NULL值(设置短TTL) | 实现简单,快速生效 | 可能被恶意攻击制造大量无效key,内存浪费 |
| 接口层校验 | 对请求参数进行格式/范围校验 | 有效拦截非法请求 | 需要明确业务规则,无法防御合法参数攻击 |
生产建议:
布隆过滤器(RedisBloom模块)+ 空值缓存组合使用,拦截99%的穿透攻击
二、缓存击穿(Cache Breakdown)
问题描述:
热点key突然失效,导致海量请求直接冲击数据库,常见于秒杀、爆款商品场景。
解决方案对比
| 解决方案 | 实现方式 | 优点 | 缺点 |
|---|---|---|---|
| 互斥锁(Mutex) | 使用Redis的SETNX实现分布式锁 | 保证数据强一致性 | 增加系统复杂度,锁等待影响吞吐量 |
| 逻辑过期时间 | 缓存永不过期,业务代码维护逻辑过期时间 | 避免锁竞争,性能优异 | 需要维护版本号,可能读到旧数据 |
| 永不过期策略 | 物理永不过期,异步更新缓存 | 彻底避免击穿问题 | 内存占用持续增长,需配套淘汰策略 |
三、缓存雪崩(Cache Avalanche)
问题描述:
大量key同时过期或Redis集群宕机,导致请求全部直达数据库。
解决方案对比
| 解决方案 | 实现方式 | 优点 | 缺点 |
|---|---|---|---|
| 随机时段过期 | 基础TTL + 随机数(如3600±600秒) | 实现简单,有效分散过期时间 | 需要根据业务调整随机时间窗口 |
| 多级缓存架构 | 本地缓存(Caffeine)+ Redis分级缓存 | 提升系统可用性级别 | 架构复杂度高,数据一致性维护成本增加 |
| 熔断降级 | 使用Hystrix等工具进行流量控制 | 保护数据库不被压垮 | 可能影响正常用户体验 |
| 集群高可用 | Redis Sentinel/Cluster部署 | 提升系统容灾能力 | 运维复杂度增加,硬件成本提高 |
监控指标:
-
缓存命中率低于80%触发预警
-
数据库QPS超过阈值自动熔断
四、综合解决方案推荐
生产环境推荐方案组合:
-
穿透防御:布隆过滤器(前置拦截)+ 空值缓存(兜底防护)
-
击穿防护:热点数据永不过期 + 互斥锁(双保险策略)
-
雪崩预防:分层缓存架构 + 随机过期时间 + Sentinel监控
架构设计要点:
-
数据一致性:采用canal监听binlog异步更新缓存
-
监控体系:Prometheus监控缓存命中率+数据库QPS
-
降级策略:配置动态开关,支持手动切换降级模式
不同业务场景需灵活选择方案,例如金融交易系统优先保证一致性,电商大促场景侧重高可用性。实际应用中建议通过压测验证方案有效性。
总结
缓存穿透、击穿和雪崩是使用 Redis 缓存时可能遇到的三大常见问题。通过合理的解决方案,可以有效避免这些问题,提升系统的稳定性和性能。
- 缓存穿透:推荐使用布隆过滤器结合空值缓存,有效拦截 99% 的穿透攻击。
- 缓存击穿:根据业务场景选择互斥锁或永不过期策略,确保热点数据的稳定性。
- 缓存雪崩:结合随机时段过期和多级缓存架构,分散缓存失效时间,提升系统可用性。
通过合理的解决方案和监控指标,可以有效避免这三类问题,提升系统的稳定性和性能。
希望本文可以帮助你在实际项目中解决这些问题,提升系统的可用性和性能!
相关文章:
Redis 缓存穿透、击穿、雪崩:问题与解决方案
在使用 Redis 作为缓存中间件时,系统可能会面临一些常见的问题,如 缓存穿透、缓存击穿 和 缓存雪崩。这些问题如果不加以解决,可能会导致数据库压力过大、系统响应变慢甚至崩溃。本文将详细分析这三种问题的起因,并提供有效的解决…...
macos sequoia 禁用 ctrl+enter 打开鼠标右键菜单功能
macos sequoia默认ctrlenter会打开鼠标右键菜单,使得很多软件有冲突。关闭方法: end...
Android14 Camera框架中Jpeg流buffer大小的计算
背景描述 Android13中,相机框架包含对AIDL Camera HAL的支持,在Android13或更高版本中添加的相机功能只能通过AIDL Camera HAL接口使用。 对于Android应用层来说,使用API34即以后版本的Camera应用程序通过Camera AIDL Interface访问到HAL层…...
springboot系列十四: 注入Servlet, Filter, Listener + 内置Tomcat配置和切换 + 数据库操作
文章目录 注入Servlet, Filter, Listener官方文档基本介绍使用注解方式注入使用RegistrationBean方法注入DispatcherServlet详解 内置Tomcat配置和切换基本介绍内置Tomcat配置通过application.yml完成配置通过类配置 切换Undertow 数据库操作 JdbcHikariDataSource需求分析应用…...
区块链共识机制详解
区块链共识机制详解 🤝 1. 什么是共识机制? 共识机制是区块链网络中,所有节点就某个状态(如交易的有效性)达成一致的规则和过程。它解决了在去中心化网络中如何确保数据一致性的问题。 2. 主流共识机制 2.1 工作量证…...
详解单例模式、模板方法及项目和源码应用
大家好,我是此林。 设计模式为解决特定问题提供了标准化的方法。在项目中合理应用设计模式,可以避免重复解决相同类型的问题,使我们能够更加专注于具体的业务逻辑,减少重复劳动。设计模式在定义系统结构时通常考虑到未来的扩展。…...
解耦的艺术_应用架构中的解耦
文章目录 Pre解耦的技术演化应用架构中的解耦小结 Pre 解耦的艺术_通过DPI依赖倒置实现解耦 解耦的艺术_通过中间层映射实现解耦 解耦的技术演化 技术的演化史,也是一部解耦的历史。从最初的面向对象编程(OOP)到Spring框架的依赖注入&…...
Winform(C#) 项目保存页面
上一张我们已经实现了TCP和串口页面的数据展示,和保存控件 我们这一章,实现如何去,控制保存。 一、控件展示 CheckBox TextBox Button label Name: checkSaveImage checkDelete txtSaveDays txtSaveImagePath btnSelectIm…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_array_init 函数
ngx_array_init 定义在 src/core/ngx_array.h static ngx_inline ngx_int_t ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size) {/** set "array->nelts" before "array->elts", otherwise MSVC thinks* that "…...
LangChain-基础(prompts、序列化、流式输出、自定义输出)
LangChain-基础 我们现在使用的大模型训练数据都是基于历史数据训练出来的,它们都无法处理一些实时性的问题或者一些在训练时为训练到的一些问题,解决这个问题有2种解决方案 基于现有的大模型上进行微调,使得它能适应这些问题(本…...
蓝思科技赋能灵伴科技:AI眼镜产能与供应链双升级
2月22日,蓝思科技宣布与AI交互领军企业杭州灵伴科技(Rokid)达成深度战略合作,通过整机组装与全产业链整合,为2025年全球AI眼镜出货量爆发式增长(预计达400万-1200万台)提供核心支撑。 双方合作通…...
2025前端框架最新组件解析与实战技巧:Vue与React的革新之路
作者:飞天大河豚 引言 2025年的前端开发领域,Vue与React依然是开发者最青睐的框架。随着Vue 3的全面普及和React 18的持续优化,两大框架在组件化开发、性能优化、工程化支持等方面均有显著突破。本文将从最新组件特性、使用场景和编码技巧三…...
零基础学QT、C++(六)制作桌面摄像头软件
目录 一、前言 二、Python项目包 三、C项目包 四、 项目说明 五、结语 章节汇总 一、前言 上一节,成功导入了OpenCV库 零基础学QT、C(四)QT程序打包-CSDN博客文章浏览阅读1.1k次,点赞29次,收藏23次。QT程序打包。将项…...
使用docker开发镜像编译
前言 搭建参考的是官网文档 环境 wsl2 wsl2内存分配和禁用swap 在window主机中,按下快捷键win+r,输入%UserProfile%,会跳转到用户目录,在该目录下,如果没有wsl配置文件,则创建一个.wslconfig,文件类型应为WSLCONFIG,而不是文档类型 我是用vscode来创建的,进入到.wslco…...
python-leetcode-回文链表
234. 回文链表 - 力扣(LeetCode) # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def isPalindrome(self, head: Optional[Lis…...
windows的CMD命令提示符
一.打开CMD命令窗口 方法一:开始菜单 -> Windows 系统 -> 命令提示符。方法二:按下快捷键 Win R 打开运行,输入 cmd 回车。方法三:点击任务栏搜索按钮,搜索 cmd 并打开。方法四:在资源管理器的地址…...
虚拟机从零实现机器人控制
1. 系统安装 因Docker不适合需要图形界面的开发,因此使用虚拟机VMware方便可视化界面方式查看效果,相关软件可以从官网下载,这里有一整套免费安装文件百度网盘地址: 2. ROS安装 Ubuntu 22.04:https://docs.ros.org…...
mysql之B+ 树索引 (InnoDB 存储引擎)机制
b树索引机制 B 树索引 (InnoDB 存储引擎)机制**引言:****1. 数据页结构与查找**2. 索引的引入**3. InnoDB 的 B 树索引****4. InnoDB B 树索引的注意事项****5. MyISAM 的索引方案 (选读,与 InnoDB 做对比)****6. MySQL 中创建和删除索引的语句** **B 树…...
Spring Boot定时任务原理
Spring Boot定时任务原理 在现代应用中,定时任务的调度是实现周期性操作的关键机制。Spring Boot 提供了强大的定时任务支持,通过注解驱动的方式,开发者可以轻松地为方法添加定时任务功能。本文将深入探讨 Spring Boot 中定时任务的实现原理…...
MySQL 架构
目录 1. MySQL 架构概览 (1) 客户端/服务器架构 (2) 存储引擎架构 2. 主要组件 (1) 客户端工具 (2) MySQL 服务器 (3) 存储引擎 3. MySQL 架构图 4. MySQL 架构的特点 5. MySQL 的高级架构 (1) 主从复制(Master-Slave Replication) (2) 主主…...
Unity 聊天气泡根据文本内容适配
第一步 拼接UI 1、对气泡图进行九宫图切割 2、设置底图pivot位置和对齐方式 pivot位置:(0,1) 对齐方式:左上对齐 3、设置文本pivot位置和对齐方式,并挂上布局组件 pivot设置和对齐方式和底图一样&#…...
ok113i平台——usb触摸屏驱动开发
在嵌入式Linux系统中,如果USB触摸屏能够检测到并且在手指移动时有数据,但点击无法触发,这可能是因为触摸屏驱动或配置的问题。以下是一些可能的解决方法: 1. 确认驱动支持 首先,确保您使用的触摸屏驱动程序完全支持您…...
AI 百炼成神:逻辑回归, 垃圾邮件分类
第二个项目:逻辑回归垃圾邮件分类 项目代码下载地址:https://download.csdn.net/download/m0_56366541/90398247 项目目标 学习逻辑回归的基本概念。使用逻辑回归算法来实现垃圾邮件的分类。理解如何处理文本数据以及如何评估分类模型的性能。项目步骤 准备数据集 我们将使…...
【Unity】Unity clone 场景渲染的灯光贴图异位问题
Unity clone 场景渲染的灯光贴图异位问题 问题 需要将一个场景clone 一份保存到本地 当克隆完成后,副本场景的灯光贴图异位了,与原场景存在较大的差别 问题原因 场景被clone 后,场景的灯光渲染数据不能共用,即Lightmapping.li…...
Android Studio安装配置及运行
一、下载Android Studio 官网下载:下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 跳转到下载界面,选择同意条款,并点击下载,如图: 二、详细安装 双击下载的文件 三、配置Android Studio …...
运维脚本——9.配置漂移检测
场景:检测服务器配置与基准配置的差异,防止未经授权的修改。 示例:使用Ansible Playbook对比当前配置与标准模板。 - hosts: alltasks:- name: Check SSH configuration against baselineansible.builtin.diff:path: /etc/ssh/sshd_configori…...
FTP 实验(ENSP模拟器实现)
FTP 概述 FTP(File Transfer Protocol,文件传输协议)是一种用于在网络上进行文件传输的标准协议。它允许用户在两台计算机之间上传和下载文件。 1、FTP采用客户端-服务器模型,客户端通过FTP客户端软件,连接到FTP服务…...
基于 DeepSeek + Gemeni 打造 AI+前端的多人聊天室
开源项目 botgroup.chat 介绍 AI 多人聊天室: 一个基于 React 和 Cloudflare Pages(免费一键部署) 的多人 AI 聊天应用,支持多个 AI 角色同时参与对话,提供类似群聊的交互体验。体验地址:https://botgroup.chat 开源仓库&#x…...
rust笔记5-derive属性2
在 Rust 中,derive 是一种自动为结构体或枚举实现特定 trait 的机制。通过 #[derive(...)] 属性,Rust 编译器可以自动生成一些常见 trait 的实现代码,从而减少手动编写重复代码的工作量。 以下是对 Copy、Clone、Hash 和 Default 这几个常用 trait 的详细介绍和示例: 1. C…...
【电机控制器】ESP32-C3语言模型——豆包
【电机控制器】ESP32-C3语言模型——豆包 文章目录 [TOC](文章目录) 前言一、简介二、代码三、实验结果四、参考资料总结 前言 使用工具: 提示:以下是本篇文章正文内容,下面案例可供参考 一、简介 二、代码 #include <WiFi.h> #inc…...
