浅谈Redis和分布式系统

浅谈Redis

Redis用于存储数据,且在内存当中进行存储。

但是在日常编写代码中,定义一个变量也就属于在内存当中存储一个数据。

Redis主要会在分布式系统当中发挥重要作用,如果只是单机程序,直接通过变量存储数据的方式会比使用Redis更优。=

为什么会使用Redis?

主要原因是:当今的系统一般是分布式系统,存在多个进程,而进程是具有隔离性的。

我们如果要在进程之间通信,就需要通过网络的方式。

所以,Redis是基于网络的,可以把自己的内存中的变量给别的进程,甚至别的主机的进程进行使用。

与MySQL进行对比

MySQL存在一个最大的问题:访问数据的速度很慢。MySQL的数据存在于硬盘当中。

很多互联网产品对于性能的要求极高。

所以Redis也可以作为数据库进行使用。

Redis虽然快,但是存储空间小。

是否能够让Redis和MySQL的优点结合起来?

把常使用数据存放在Redis当中,将不常用的数据存储在MySQL当中。

当然代价是有的,就是系统的复杂度提升。

数据发生修改,还存在Redis和MySQL的数据同步问题。

单机架构与分布式架构

单机架构,只有一台服务器,这个服务器负责所有的工作。

分布式,引入多台主机。

负载均衡器

负载均衡器(Load Balancer)是在计算机网络中常用的一种技术,用于在多个服务器之间分配负载,以实现更好的性能、可靠性和可扩展性。它可以帮助有效地处理大量的请求并确保系统的稳定运行。

负载均衡器的主要目标是将请求分发到多个服务器上,以避免单个服务器过载,并确保系统能够高效地响应用户的请求。它可以根据不同的算法和条件来决定如何分配负载,例如轮询、加权轮询、最少连接数等。


负载均衡器的工作原理


1.接收请求:负载均衡器作为系统的入口点,接收来自客户端的请求。

2.负载分发:根据预设的负载均衡算法,将请求分发到后端服务器。常见的负载均衡算法有轮询、加权轮询、最少连接数等。
3.处理请求:后端服务器接收到请求后,处理请求并返回响应给负载均衡器。
4.响应返回:负载均衡器将后端服务器返回的响应发送给客户端。

负载均衡器的好处包括:


1.提高性能:通过将负载分发到多个服务器上,负载均衡器可以减轻单个服务器的负载,从而提高整体系统的性能和响应速度。
2.提高可靠性:如果某个服务器发生故障,负载均衡器可以将请求重新分发到其他正常运行的服务器上,从而提高系统的可靠性和容错能力。
3.实现可扩展性:通过添加更多的服务器并将负载均衡器配置为将请求均匀分发到这些服务”器上,可以实现系统的可扩展性,以满足不断增长的用户需求。
4.简化管理:负载均衡器可以集中管理和监控多个服务器,简化了系统的管理和维护。

tips:负载均衡器,对于请求量的承担量,要远超过应用服务器。

负载均衡器,相当于领导,分配任务。

应用服务器,相当于员工,执行任务。

增加应用服务器,确实能够处理更高的请求量,但是随之存储服务器,要承担的请求量也就更多了。

可采取以下措施

数据库读写分离

主数据库负责写,从数据库负责读,而且主数据库会同步数据到从数据库。

读的频率会比写的频率要高很多。

一般来说,主服务器是一个,从服务器可以有多个。

同时从数据库通过负载均衡的方式,让应用服务器进行访问。

当然,数据库天然有个问题:响应速度是更慢的!

我们还可以通过以下方式来解决

Redis作为热数据缓存

把数据区分为“冷热”,热点数据放到缓存中,缓存的访问速度往往比数据库要快多了。

但是缓存要想快,就需要付出一些代价 -> 很小

所以Redis通常就是作为缓存服务器使用。

此时,缓存数据库就帮助数据库服务器负重前行。

引入分布式系统,不光要能够应对更高的请求量(并发量),同时也要能应对更大的数据量。

如果出现了一个主机装不下那么大的数据量呢?

就需要多台主机来存储。

分库分表

首先我们可以针对数据库进一步的拆分。

本来一个数据库服务器,这个数据库服务器上有多个数据库,也就是逻辑上的数据集合。

现在可以引入多个数据库服务器,每个数据库服务器存储一个或者一小部分数据库。

如下:

微服务

之前应用服务器,一个服务器程序里面做了很多的业务,这就可能会导致这一个服务器的代码变得越来越复杂。

为了更方便于代码的维护,就可以把这样的复杂的服务器拆分成更多的,功能更单一,但更小的服务器。(微服务)

以上使得服务器的种类和数量增加。

这里需要注意:微服务在本质上是解决“人”的问题。

当应用服务器复杂了,势必就需要更多的人来维护。

人多了就需要分组,再分工。

按照功能,拆分成多组微服务,就可以有利于上述 人员的组织机构的分配。

引入微服务,解决了“人”的问题,付出的代价:

1.整个系统的性能会下降。(网络通信比进程内通信慢太多了)

2.系统复杂程度提高,可用性受到影响

拆出来更多的服务,多个功能之间要更依赖网络通信。

网络通信的速度很可能是比硬盘还慢的。

要想保证性能不下降太多,只能引入更多的机器,更多的硬件资源。直白点说就是充钱呗。

服务器更多了,出现问题的概率更大了

这就需要一系列的手段来保证系统的可用性。(监控报警,配套的运维人员)

但是微服务还是有一定的优势的。

微服务的优势

1.解决了“人”的问题。

2.使用微服务可以更方便于功能的复用。

3.可以给不同的服务进行不同的部署。硬件资源的调配。

下面再来讲一些概念:

概念

分布式与集群

分布式和集群同样是引入多个主机/服务器,协同配合完成一系列的工作。

分布式是指在物理上的多个主机,而集群表示的是逻辑上的多个主机。

主从:

多个服务器节点,其中一个是主,其他为从,从节点的数据要从主节点同步过来。

中间件

和业务无关的服务(功能更通用的服务)

eg:1.数据库  2.缓存  3.消息队列

总结

1.单机架构(应用程序 + 数据库服务器)

2.数据库和应用分离

应用程序和数据库服务器 分别放到不同的主机上部署。

3.引入负载均衡,应用服务去 => 集群

通过负载均衡器,把请求均匀的分发给集群中的每个服务器。

当集群某一个主机挂了,其他的主机依然可以承担服务,提高了整个系统的可用性。

4.引入数据库读写分离,数据库主从结构

一个数据库节点作为主节点,其他的数据库节点作为从节点。

主节点负责写数据,从节点负责读数据。

主节点需要把修改后的数据同步给从节点。

5.引入缓存,冷热数据分离

进一步提升了服务器针对请求的处理能力。

Redis在一个分布式系统当中,通常扮演着缓存的角色

引入的问题:数据库和缓存的数据的一致性。

6.引入分库分表,数据库能够进一步扩展存储空间

7.引入微服务,从业务上进一步拆分应用服务器

  从业务功能的角度,把应用服务器,拆分成更多更单一,更小,更简单的服务器。

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

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

相关文章

Listener(监听器)

文章目录 Listener和ServletContext1.0 ServletContext对象介绍1.1 Listener概述1.2 Listener快速入门① xml版本② 注解版本 1.3 案例:模拟spring框架 Listener和ServletContext 补充:1.ServletContext 表示上下文对象,属于接口&#xff0c…

MySQL主从读写分离之Proxysql(openEuler版)

实验目的: 基于proxysql实现MySQL的主从读写分离。 实验过程: 前期准备: 一共有四台虚拟机,其中三台为配置好的一主两从虚拟机,还有一台干净的虚拟机用来配置proxysql。 主机名地址master192.168.27.137node1192.…

bat文件给多个Android设备安装apk

本文是安装一个apk 1、确保以下3个文件在同一个目录下 1>要安装的apk,这里是mmb.apk 2>设备名单,保存在.txt文件中,一行一个设备名,设备名通过adb devices获取,截图中是两个设备 txt文件中的样式 3>要运行…

【Pytorch】进阶学习:深入解析 sklearn.metrics 中的 classification_report 函数---分类性能评估的利器

【Pytorch】进阶学习:深入解析 sklearn.metrics 中的 classification_report 函数—分类性能评估的利器 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合…

机器学习分析地图数据位置距离

在地理信息系统(GIS)和各类导航应用中,精准地计算地理位置间的距离是核心功能之一。然而,面对大规模地图数据和复杂的地理环境,传统几何计算方法可能无法满足需求,此时机器学习技术可以发挥重要作用&#x…

外包干了3个月,技术退步明显。。。。

先说一下自己的情况,本科生,2019年我通过校招踏入了南京一家软件公司,开始了我的职业生涯。那时的我,满怀热血和憧憬,期待着在这个行业中闯出一片天地。然而,随着时间的推移,我发现自己逐渐陷入…

python中nonlocal简介及用法

nonlocal是python中的一个关键字,它用于在嵌套函数中修改外层函数的局部变量。局部变量是在函数内部定义的变量,它们只在函数的作用域内有效,不能被其他函数访问或修改。嵌套函数是在一个函数内部定义的另一个函数,它可以访问外层…

定制repo(不再切换python和google源)

文章目录 定制repo(不再切换python和google源)前言各用各的repo定制repo2/repo3源码自动识别repo2/repo3项目完整解决方案: 定制repo(不再切换python和google源) 众知,Android/AOSP/ROM系统开发&#xff0c…

rust开发100问?

Rust如何管理内存?Rust的所有权是什么?生命周期在Rust中如何工作?什么是借用在Rust中?如何在Rust中创建枚举类型?Rust中的trait是什么?如何定义并实现一个结构体(struct)的方法&…

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记05_共谋(中)

1. 默许共谋 1.1. 又称寡头价格协调(Oligopolistic Price Coordination)或有意识的平行行为(Conscious Parallelism) 1.1.1. 在条件允许的情况下,它会发生在市场集中度较高的行业当中 1.1.…

微信小程序返回上一页刷新组件数据

在父页面的onShow和onHide里面添加一个标志 onShow() {this.setData({show:true})},onHide() {this.setData({show:false})}, 把这个值传给子组件 <importantList slot"importantConcern" flag"{{barSelect}}" flag2"{{show}}" /> 在子组…

论文笔记 Where Would I Go Next? Large Language Models as Human Mobility Predictor

arxiv 2023 08的论文 1 intro 1.1 人类流动性的独特性 人类流动性的独特特性在于其固有的规律性、随机性以及复杂的时空依赖性 ——>准确预测人们的行踪变得困难近期的研究利用深度学习模型的时空建模能力实现了更好的预测性能 但准确性仍然不足&#xff0c;且产生的结果…

kotlin图片合成和压缩

kotlin图片合成和压缩 之前的方法是继承AsyncTask 在doInBackground 里面去做压缩的操作&#xff0c;然后用 publishProgress 切到主线程里面更新 新方法是在协程里的去做 class ImageService {private fun getSumWidths(bitmaps: ArrayList<Bitmap>): Int {var sumWid…

爬虫(五)

1. 前端JS相关 三元运算 v1 条件 ? 值A : 值B; # 如果条件成立v1值A&#xff0c;不成立v1等于值Bres 1 1 ? 99 : 88 # res99特殊的逻辑运算 v1 11 || 22 # Ture v2 9 || 14 # 9 v3 0 || 15 # 15 v3 0 || 15 || "zhangfei" # 15赋值和…

201909 青少年软件编程(Scratch)等级考试试卷(一级)

第1题&#xff1a;【 单选题】 小明在做一个采访的小动画&#xff0c;想让主持人角色说“大家好&#xff01;”3秒钟&#xff0c;用下列程序中的哪一个可以实现呢&#xff1f;&#xff08; &#xff09; A: B: C: D: 【正确答案】: B 【试题解析】 : 第2题&#xff1a…

领域模型设计-COLA架构

前言 当我们需要创建的新应用的时候&#xff0c;往往需要站在一个长远的角度来设计我们的系统架构。有时候我们接手一个老的应用的时候&#xff0c;会发现由于创建之初没有好好规划系统架构&#xff0c;导致我们后期开分成本和维护成本都非常高。近些年来领域模型的系统设计非常…

《AI歌手:音乐产业的未来之音?》

引言 随着人工智能技术的快速发展,AI歌手作为一种新兴的演艺模式逐渐走进了人们的视野。AI歌手以其独特的魅力和无限的潜力引发了人们对于音乐产业未来的思考。本文将围绕AI歌手的音乐呈现、市场认可、替代性以及其他类似AI应用等方面展开讨论,探究AI歌手是否有望成为音乐产…

Rust 中有哪些实现了 std::error::Error 的类型?

在 Rust 中&#xff0c;std::error::Error trait 被许多内置类型和第三方库中的类型所实现。以下是一些实现了 std::error::Error trait 的常见类型&#xff1a; 内置类型 std::io::Error&#xff1a;用于表示 I/O 操作中的错误&#xff0c;如文件读写错误或网络操作错误。 s…

Matlab|10节点潮流计算程序(通用性强)

主要内容 潮流计算程序matlab 牛拉法 采用matlab对10节点进行潮流计算&#xff0c;采用牛拉法&#xff0c;程序运行可靠&#xff0c;牛拉法实现通用性强&#xff0c;可替换参数形成其他节点系统的潮流计算程序。 下载链接

如何选择低代码开发平台?必看注意事项揭秘!

低代码开发平台和零代码开发平台是近几年时兴的一种新的程序开发方法。该模式的特征是可以使用用户界面、拖拽操作等方式快速构建应用软件软件&#xff0c;从而减少开发者的学习标准&#xff0c;使每个人都能变成开发者。 在选择低代码开发平台时&#xff0c;要确保平台能够满足…