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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python机器学习算法入门教程(第四部分)

接着Python机器学习算法入门教程(第三部分),继续展开描述。 十九、信息熵是什么 通过前两节的学习,我们对于决策树算法有了大体的认识,本节我们将从数学角度解析如何选择合适的“特征做为判别条件”,这里…

微服务 Spring Cloud 5,一图说透Spring Cloud微服务架构

目录 一、域名系统DNS二、LVS(Linux Virtual Server),Linux虚拟服务器三、CDN静态资源四、Nginx反向代理服务器1、Nginx的主要作用体现在以下几个方面:2、Nginx静态资源服务和CDN静态资源服务,如何选择? 五、Gateway网…

C#上位机序列10: Winform上位机通用框架

C#上位机序列1: 多线程(线程同步,事件触发,信号量,互斥锁,共享内存,消息队列) C#上位机序列2: 同步异步(async、await) C#上位机序列3: 流程控制(串行,并行&#xff0c…

Panorama SCADA平台的警报通知功能配置详解

1. 前言 SCADA系统的主要目标是采集与监控工业过程数据,以确保工业生产正常运行。通过实时警报通知功能,操作人员可以立即获取有关潜在问题的信息,从而能够快速采取行动解决问题,防止进一步的损害或生产中断。因此,及…

三相电机的某些实测特性曲线

三相电机参数: 0.75KW,额定电流是2A,功率因数0.71,效率78.9%。制式S1. 1.负载不变时的线电压与线电流的关系 1.1相关数据与python代码: 这里记录了一系列的实验: 第一组实验:近乎空载&#xf…

企业微信开启接收消息+验证URL有效性

企业微信开启接收消息验证URL有效性 📔 千寻简笔记介绍 千寻简笔记已开源,Gitee与GitHub搜索chihiro-notes,包含笔记源文件.md,以及PDF版本方便阅读,且是用了精美主题,阅读体验更佳,如果文章对…

[Framework] Android Handler 工作原理

作者:Tans5 Android 中的 Handler 都被人说烂了,但是还是想多说一次,因为在 Android 的系统中它真的非常重要而且它的机制并没有很复杂,无论是新手和老手都可以好好学习下,这对理解 Android 系统很重要,所以…

如何进行网站测试

随着市场和技术的快速发展,产品需要不断更新和改进以保持竞争力,如果产品停滞不前,很可能会被市场淘汰。通过持续发展,企业可以不断优化产品,提高用户体验,从而赢得市场份额和客户忠诚度。而数通在激烈的市…

计算机毕业设计项目选题推荐(免费领源码)Java+springboot+Mysql停车微信小程序小程序92714

摘 要 在信息飞速发展的今天,网络已成为人们重要的信息交流平台。每天都有大量的农产品需要通过网络发布,为此,本人开发了一个基于springboot停车微信小程序小程序。 对于本停车微信小程序的设计来说,它主要是采用后台采用java语…

Vue+OpenLayers 创建地图并显示鼠标所在经纬度

1、效果 2、创建地图 本文用的是高德地图 页面 <div class"map" id"map"></div><div id"mouse-position" class"position_coordinate"></div>初始化地图 var gaodeLayer new TileLayer({title: "高德地…

PDF有限制密码,不能复制怎么办?

大家现在接触PDF文件越来越多&#xff0c;有的时候在网上下载的PDF文件打开之后&#xff0c;发现选中文字之后无法复制。甚至其他功能也都无法使用&#xff0c;这是怎么回事&#xff1f;该怎么办&#xff1f; 当我们发现文件打开之后&#xff0c;编辑功能无法使用&#xff0c;很…

数据库数据迁移常见方式

数据库数据迁移常见方式 数据库数据迁移常见方式1、通过sql2、通过数据迁移工具3、云服务进行数据迁移什么是DRS服务如何使用DRS服务DRS云服务可以干什么 数据库数据迁移常见方式 1、通过sql 批量导入sql insert into tableName select * 2、通过数据迁移工具 在数据库里面…

19.9 Boost Asio 同步字典传输

这里所代指的字典是Python中的样子&#xff0c;本节内容我们将通过使用Boost中自带的Tokenizer分词器实现对特定字符串的切割功能&#xff0c;使用Boost Tokenizer&#xff0c;可以通过构建一个分隔符或正则表达式的实例来初始化tokenizer。然后&#xff0c;可以使用该实例对输…

网络工程师回顾学习(第一部分)

根据书本目录&#xff0c;写下需要记忆的地方&#xff1a; 参考之前的笔记&#xff1a; 网络工程师回答问题_one day321的博客-CSDN博客 重构第一部分需要记忆的&#xff1a; 第一章&#xff1a;计算机网络概论 计算机网络的定义和分类&#xff1a;计算机网络是指将地理位…

Azure - 机器学习:自动化机器学习中计算机视觉任务的超参数

Azure Machine Learning借助对计算机视觉任务的支持&#xff0c;可以控制模型算法和扫描超参数。 这些模型算法和超参数将作为参数空间传入以进行扫描。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济…

MYSQL函数,一篇文章看完!

做程序员的谁会离得开数据库呢&#xff1f;今天就来分享一下我整理的MySQL的常用函数&#xff0c;基本上囊括了平时要用的函数&#xff0c;它们已经陪我走过了不少年头了&#xff0c;风里来雨里去&#xff0c;缝缝补补又几年&#xff0c;希望能帮到你们&#xff01; 如果数据库…

UltraEdit2024免费版文本编辑器

我们必须承认软件员使用的编辑器或代码编辑器是一款强大 IDE 的重要组成部分&#xff0c;它是任何 IDE 的核心基础。用户量向我们证明了UEStudio 基于著名的 UltraEdit 进行构建&#xff0c;同样&#xff0c;软件的主干非常成熟和稳定&#xff0c;并且已经被证实成为文本和软件…

Python 标准库 subprocess 模块详解

1. Subprocess模块介绍 1.1 基本功能 subprocess 模块&#xff0c;允许生成新的进程执行命令行指令&#xff0c;python程序&#xff0c;以及其它语言编写的应用程序, 如 java, c,rust 应用等。subprocess可连接多个进程的输入、输出、错误管道&#xff0c;并且获取它们的返回…

龙芯loongarch64服务器编译安装scipy

前言 根据我之前的文章介绍&#xff0c;龙芯loongarch64服务器中的很多python依赖包安装有问题&#xff0c;发现其中安装的"scikit-learn"就无法正常使用&#xff0c;所有这里在 pip3 install scikit-learn -U -i https://pypi.tuna.tsinghua.edu.cn/simple 的时候发…

酷开系统,让这个秋天更有温度

在这个秋意渐浓的季节&#xff0c;你是不是也在寻找一种方式&#xff0c;让这个秋天变得更加温暖和充满活力&#xff1f;随着科技的不断发展&#xff0c;智能电视已经成为家庭娱乐的重要载体&#xff0c;酷开系统&#xff0c;作为智能电视行业的佼佼者&#xff0c;不仅提供了海…