【Redis缓存架构实战常见问题剖析】
文章目录
- 一、Redis缓存架构实战剖析
- 1.1、大规模的商品缓存数据冷热分离机制
- 1.2、缓存击穿导致线上数据压力暴增解决方案
- 1.3、缓存穿透及其解决方案剖析
- 1.4、突发性的热点缓存数重建导致系统压力暴增问题分析
- 1.5、Redis分布式锁解决缓存与数据库双写不一致问题剖析
- 1.6、利用多级缓存解决Redis线上集群缓存雪崩问题分析
一、Redis缓存架构实战剖析
1.1、大规模的商品缓存数据冷热分离机制
我们都知道,缓存的内存资源是有限的,例如像jd、tb等大平台的商品信息,商品信息都是很多的,不可能是将所有的商品数据都缓存,那应该缓存那些数据,结合生活中的实际问题,需要缓存的数无非就是经常被大众点击查看或者购买的商品,那我们在对资源进行缓存时,会给其数据设置一个过期时间,如果时间过了都没被访问,那就需要从缓存中移除==>我就是冷数据,如果是被访问了,我们需要将当前数据的过期时间重新更新,延长其过期时间,保证这种经常被访问的数据属于长时间不过期的数据,也就是热数据,这样子我们就可以将不同访问频率的数据区分开来

1.2、缓存击穿导致线上数据压力暴增解决方案
在对这个问题解决之前:首先我们需要先知道,什么是缓存击穿?产生的原因是什么?
缓存击穿,也称为缓存失效,主要是指由于大批量的缓存在同一时间失效,可能导致大量的请求穿透缓存访问到数据库上,导致数据库的压力暴增甚至导致数据库挂掉,我们就称这种现象为缓存击穿
其解决方案主要是从产生问题的原因入手,我们可以调整批量导入的不同数据的缓存时间,例如,在设置不同key数据时,以基底时间+随机生成的时间,来避免同一时间大批量的缓存数据失效问题,如下图示:

1.3、缓存穿透及其解决方案剖析
缓存击穿,主要是指客户端查询一个不存在数据(Redis和数据库都不存在),缓存不会命中,数据库也不会命中,从而导致大批量的数据访问到数据库层,导致数据库的压力倍增,那产生这种问题的原因是多方面的,例如:写的业务代码逻辑出问题、平台被恶意攻击等
解决方也是多方面的,主要有:
1、缓存空对象:我们在访问某个key时,如果Redis和数据库都查询不到数据,那我们就可以在Redis中缓存一个空对象信息,如果下次同样的key再次访问,就可以直接在Redis中获取且返回即可,当然,我们还需要考虑恶意攻击的,以不同的key来大量访问,那我们在上一步设置key时,加入一个缓存数据过期时间,类似空对象的数据,过期时间我们不用设置太长时间即可,如下图示:

2、使用布隆过滤器:对于恶意攻击,向服务器请求大量不存在的数据造成的缓存穿透,还可以用布隆过滤器先做一次过滤,对于不存在的数据布隆过滤器一般都能够过滤掉,不让请求再往后端发送。当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存在。
1.4、突发性的热点缓存数重建导致系统压力暴增问题分析
这张突发性的热点缓存数据,主要的场景为,例如:大V直播带货,可能介绍的商品之前属于三不问商品,好东西没被发掘,在直播大V介绍一通后,涌入一大波人对该商品进行查看以及购买等操作,那这时,Redis是无此商品信息的,大量的请求全打到数据库上,导致数据库压力暴增,甚至宕机等,针对这个问题,我们需要对该商品数据进行缓存数据重建,如何重建?我们这采用的双重校验机制===>过程为先从缓存中拿数据,如果拿不到数据,就利用分布式锁加锁(可优化,结合业务场景采用分段锁或读写锁方式),加锁模块中,再重新到Redis缓存中拿数据,如果拿不到,就需要到数据库读取数据,同时缓存数据到Redis缓存中,以便下次其他线程拿数据时,不用到数据库中拿数据,如下图:

1.5、Redis分布式锁解决缓存与数据库双写不一致问题剖析
出现这个问题的主要原因是因为在大并发场景下,一个线程向数据库写数据,正打算往Redis缓存中同步数据时,另外的线程吧数据库的数据改了,例如:A线程将数据库数据改为:10,正准备将10同步到Redis,这个过程中被线程B打断,将数据库的数据改为6,然后A线程将Redis的数据改为10,这样子就导致了数据库与缓存数据双写不一致问题,如下图:

解决方案主要为,在这个操作的过程中加锁,例如线程A操作时,需要将数据库写入数据与缓存更新这个过程加一把分布式锁即可
1.6、利用多级缓存解决Redis线上集群缓存雪崩问题分析
缓存雪崩主要是指,当Redis服务支撑不住宕机后,很大流量就打到后端的储存层,储存层也支撑不住如此巨大流量,进一步演化到后端服务崩盘,前端同时有可能也崩盘,导致整个服务崩盘的过程就称为缓存雪崩,解决类似问题,我们可以从以下方面着手:
1、设置缓存集群RedisCluster或者哨兵Sentinel机制
2、进行服务降级以及熔断操作,比如使用微服务中的流量防卫兵Sentinel或Hystrix等
相关文章:
【Redis缓存架构实战常见问题剖析】
文章目录 一、Redis缓存架构实战剖析1.1、大规模的商品缓存数据冷热分离机制1.2、缓存击穿导致线上数据压力暴增解决方案1.3、缓存穿透及其解决方案剖析1.4、突发性的热点缓存数重建导致系统压力暴增问题分析1.5、Redis分布式锁解决缓存与数据库双写不一致问题剖析1.6、利用多级…...
mac M2 pytorch_geometric安装
我目前的环境是mac M2,我在base环境中安装了pytorch_geometric,仅仅做测试用的,不做真正跑代码的测试 首先我的base环境的设置如下: pip install pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv -f https://data.pyg.…...
【C++】异常 智能指针
C异常 & 智能指针 1.C异常1.1.异常的抛出与捕获1.2.异常体系1.3.异常安全与规范1.4.异常优缺点 2.智能指针2.1.RAII2.2.智能指针的使用及原理2.2.1.auto_ptr2.2.2.unique_ptr2.2.3.shared_ptr2.2.4.shared_ptr的循环引用问题 & weak_ptr 2.3.定制删除器 1.C异常 C异常…...
切换数据库的临时表空间为temp1 / 切换数据库的undo表空间为 undotbs01
目录 编辑 一、切换临时表空间 1、登录数据库 2、查询默认临时表空间 3、创建临时表空间temp1(我们的目标表空间) 4、修改默认temp表空间 5、查询用户默认临时表空间 6、命令总结: 二、切换数据库的undo表空间 1、查询默认undo表…...
react: scss使用样式
方式一: 将样式作为模块使用 //List.tsx import styles from /styles/apppublish.module.scss <div className{styles.contentOverflow}></div>//apppublish.module.scss .contentOverflow {height: 100%;overflow-y: auto;display: flex;flex-directi…...
JAVA深化篇_36—— Java网络编程中的常用类
Java网络编程中的常用类 Java为了跨平台,在网络应用通信时是不允许直接调用操作系统接口的,而是由java.net包来提供网络功能。下面我们来介绍几个java.net包中的常用的类。 InetAddress的使用 作用:封装计算机的IP地址和DNS(没…...
python操作链接数据库和Mysql中的事务在python的处理
python操作数据库 pymysql模块: pip install pymysql作用:可以实现使用python程序链接mysql数据库,且可以直接在python中执行sql语句 添加操作 import pymysql #1.创建链接对象c conn pymysql.Connect(host127.0.0.1,#数据库服务器主机地址port3306, #mysql的端口…...
【qemu逃逸】XCTF 华为高校挑战赛决赛-pipeline
前言 虚拟机用户名: root 无密码 设备逆向与漏洞分析 程序没有去符合, 还是比较简单. 实例结构体如下: 先总体说一下流程: encode 为 base64 编码函数, decode 为 base64 解码函数. 然后 encPipe 和 decPipe 分别存放编码数据和解码数据, 分别有四个: 其中 EncPipeLine 中…...
muduo源码剖析之TcpClient客户端类
简介 muduo用TcpClient发起连接,TcpClient有一个Connector连接器,TCPClient使用Conneccor发起连接, 连接建立成功后, 用socket创建TcpConnection来管理连接, 每个TcpClient class只管理一个TcpConnecction,连接建立成功后设置相应的回调函数…...
C语言——switch语句判断星期
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int day 0;scanf("请输入1-7之间的整数:%d",&day);switch(day){case 1:printf("星期一\n");break;case 2:printf("星期二\n");break;case 3:printf(&quo…...
栈回溯之CmBacktrace
简介 CmBacktrace (Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下: 支持的错误包括: 断言(assert)…...
node插件MongoDB(二)——MongoDB的基本命令
文章目录 前言1. 数据库命令(1)显示所有数据库(2)切换指定数据库(若没有自动创建)(3)显示当前所在数据库(4)删除当前数据库 2.集合(表名ÿ…...
【Git】推送Github失败:remote: Permission to xxx/*.git denied to xxx
在github上,创建了token,推送代码报没权限 #设置token git remote set-url origin <your.token>github.com/<your.name>/hello-git.git#推送代码 #git push -u origin main remote: Permission to xxx/hello-git.git denied to xxx. fatal:…...
Flink -- 状态与容错
1、Stateful Operations 有状态算子: 有状态计算,使用到前面的数据,常见的有状态的算子:例如sum、reduce,因为它们在计算的时候都是用到了前面的计算的结果 总结来说,有状态计算并不是独立存在的…...
Linux C语言进阶-D15递归函数和函数指针
递归函数 指一个函数的函数体中直接或间接调用了该函数本身 执行过程分为两个过程: 递推过程:从原问题出发,按递归公式递推从未知到已知,最终达到递推终止条件 回归阶段:按递归终止条件求出结果,逆向逐步…...
LeetCode算法心得——全排列(回溯型排列)
大家好,我是晴天学长,排列型的回溯,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪 1) .全排列 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按…...
读取W25Q64的设备ID时输出0xff
发现的问题 读取W25Q64的设备ID时输出0xff 找到的不同解决方法 检查MISO和MOSI是否接对。MISO->DO,MOSI->DI检查程序在初始化spi时是否将SS拉高、SCK拉低如果是硬件spi那么检查SPI的初始化函数中,时钟极性SPI_CPOL误选为SPI_CPOL_Low࿰…...
【Docker】Docker 网络
引言 Docker是一个开源的应用容器引擎,它允许开发者将应用及其依赖打包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows机器上,也可以实现虚拟化。Docker的主要优势之一是其网络功能,而网络功能的核心就是网络驱动…...
Flutter学习:使用CustomPaint绘制路径
Flutter学习:认识CustomPaint组件和Paint对象 Flutter学习:使用CustomPaint绘制路径 Flutter学习:使用CustomPaint绘制图形 Flutter学习:使用CustomPaint绘制文字 Flutter学习:使用CustomPaint绘制图片 drawPath 绘制路…...
软件模拟SPI协议的理解和使用编写W25Q64
SPI软件模拟的时序 SPI协议中,NSS、SCK、MOSI由主机产生,MISO由从机产生,在SCK每个时钟周期MOSI、MISO传输一位数据,数据的输入输出是同时进行的,所以读写数据也可以视作交换数据。所以读写时对数据位的控制都是用同一…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
