【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等

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

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

相关文章

论文速览 | TRS 2023: 使用合成微多普勒频谱进行城市鸟类和无人机分类

注1:本文系“最新论文速览”系列之一,致力于简洁清晰地介绍、解读最新的顶会/顶刊论文 论文速览 | TRS 2023: Urban Bird-Drone Classification with Synthetic Micro-Doppler Spectrograms 原始论文:D. White, M. Jahangir, C. J. Baker and M. Antoniou, “Urban Bird-Drone…

14:00面试,14:06就出来了,问的问题有点变态。。。。。。

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到5月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…

swift语言用哪种库适合做爬虫?

目录 1、Alamofire 2、URLSession 3、YepHttp 4、Kickbox 5、Vapor 注意事项 总结 在Swift语言中,可以使用第三方库来帮助进行网络爬虫的开发。以下是几个适合Swift语言使用的爬虫库,以及相应的代码示例: 1、Alamofire Alamofire是Sw…

深入理解ClickHouse跳数索引

一、跳数索引​ 影响ClickHouse查询性能的因素很多。在大多数场景中,关键因素是ClickHouse在计算查询WHERE子句条件时是否可以使用主键。因此,选择适用于最常见查询模式的主键对于表的设计至关重要。 然而,无论如何仔细地调优主键&#xff…

Spring 常见面试题

1、Spring概述 1.1、Spring是什么? Spring是一个轻量级Java开发框架,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发。这些功能的底层都依赖于它的两个核心特性,也就是…

新能源汽车高压线束是如何快速连接到测试设备上进行电性能测试的

快速连接形成稳定的电测试在新能源行业里面是很常见的测试场景,比如说在新能源汽车行业的电池包、电机、电控制器的电性能测试中会有很多高压线束,需要将这些线束和电池包、电控制器、电机与测试设备快速连接在一起进行相关的EOL/DCR测试。 新能源汽车高…

PHP的curl会话

介绍: Curl(Client for URLs)在PHP中是一个强大而灵活的工具,用于进行各种网络请求。PHP中的Curl库允许开发者通过代码模拟HTTP请求、与API交互、进行数据传输等。在这里,我们将详细解析PHP中Curl会话的各个方面,涵盖…

《UML和模式应用(原书第3版)》2024新修订译本部分截图

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 机械工业出版社即将在2024春节前后推出《UML和模式应用(原书第3版)》的典藏版。 受出版社委托,UMLChina审校了原中译本并做了一些修订。同比来说&a…

Deepsort从入门到精通

1 ,sort和Deepsort算法 在目标检测领域,sort(Simple Online and Realtime Tracking)算法和 DeepSORT(Deep Learning for Multi-Object Tracking)算法是两种常用的目标追踪算法,它们通常与目标检…

数据结构-堆

一、什么是堆 先了解两种特别的二叉树 满二叉树 除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树 完全二叉树 完全二叉树相对于满二叉树来说,最后一层叶子节点从左到右中间没有空缺的,像这样: 计算机科学…

Netty第三部

继续Netty第二部的内容 一、ChannelHandler 1、ChannelHandler接口 ChannelHandler是Netty的主要组件,处理所有的入站和出站数据的应用程序逻辑的容器,可以应用在数据的格式转换、异常处理、数据报文统计等 继承ChannelHandler的两个子接口&#xff…

049-第三代软件开发-软件部署脚本(一)

第三代软件开发-软件部署脚本(一) 文章目录 第三代软件开发-软件部署脚本(一)项目介绍软件部署脚本(一)其他方式 关键字: Qt、 Qml、 bash、 shell、 脚本 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML(Qt Meta-Object…

​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​

软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】 课本里章节里所有蓝色字体的思维导图

软文推广中如何搭建媒体矩阵

媒体矩阵简单理解就是在不同的媒体平台上,根据运营目标和需求,建立起全面系统的媒体布局,进行多平台同步运营。接下来媒介盒子就来和大家聊聊,企业在软文推广过程中为什么需要搭建媒体矩阵,又该如何搭建媒体矩阵。 一、…

统信UOS Linux操作系统下怎么删除某个程序在开始菜单或桌面的快捷方式

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 引言 统信操作系统的开始菜单包罗万象,将所有应用的快捷方式都放在了开始菜单内。 虽然提供了分类展示的能力,但无论是分类方式还是未分类方式,都不能像windows一样将这…

Java之SpringCloud Alibaba【八】【Spring Cloud微服务Gateway整合sentinel限流】

一、Gateway整合sentinel限流 网关作为内部系统外的一层屏障,对内起到-定的保护作用&#xff0c;限流便是其中之- - .网关层的限流可以简单地针对不同路由进行限流,也可针对业务的接口进行限流,或者根据接口的特征分组限流。 1、添加依赖 <dependency><groupId>c…

CSDN每日一题学习训练——Java版(克隆图、最接近的三数之和、求公式的值)

版本说明 当前版本号[20231109]。 版本修改说明20231109初版 目录 文章目录 版本说明目录克隆图题目解题思路代码思路参考代码 最接近的三数之和题目解题思路代码思路参考代码 求公式的值题目解题思路代码思路参考代码 克隆图 题目 给你无向 连通(https://baike.baidu.com…

Python算法:动态规划解决0-1背包问题

动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09;是一种在数学、计算机科学和经济学中使用的&#xff0c;通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题&#xff0c;它能够将问题…

Spark 读取ES采坑系列

目录 一、使用的插件 二、ES集群和Elasticsearch-hadoop版本问题 三、Elasticsearch-hadoop 和Scala版本以及Spark版本&#xff08;版本不匹配会有各种异常信息 一、使用的插件 <dependency><groupId>org.elasticsearch</groupId><artifactId>elas…

java入坑之类加载器

一、类加载机制 1.1类加载过程 类加载是Java虚拟机将类的字节码数据从磁盘或网络中读入内存&#xff0c;并转换成在JVM中可以被执行的Java类型的过程。类加载器是Java虚拟机的重要组成部分&#xff0c;负责加载和解析类的字节码&#xff0c;将其转换成Java虚拟机中的类对象&am…