初始分布式系统和Redis特点(

(一)认识redis

    Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。

   起初redis是用来作为一个“消息队列”的,简单理解就是在分布式系统下的生产者消费者模型,但是随着计算机的发展,我们很少会直接使用redis作为消息队列,反而用redis来做一些其他的事情,比如数据库。

   那之前我们学到的mysql和redis哪一个更合适我们?这里我们要先了解,redis存储数据是在内存中存储的,这就使得我们访问速度比较快,而mysql的数据是在硬盘上存储的,这就会导致我们的访问速度比较慢。但是内存空间是有限的,虽然硬盘空间也有限,但是相比内存还是大了不少。

   所以在对于性能要求比较高的情况下,我们可以选择redis,在对性能要求不高的情况下可以使用mysql。我们也可以结合redis和mysql,我们可以将需要频繁访问的数据放到redis中,其他数据放到mysql中,这样就可以解决内存不够大,且效率低的问题,但是凡事有两面性,这样会导致系统的复杂程度提升,如果数据发生修改还会涉及到redis和mysql的数据同步问题。

    这时我们就会有疑问?在内存中存储数据,但我们定义变量不也是在内存中存储的吗?为什么要使用redis,这时因为进程有隔离性,进程间的通信需要基于网络,而redis就可以通过网络将自己内存中的变量给其他进程甚至主机使用(也就是分布式系统中),如果知识单机单进程,那我们完全没有必要使用redis。

(二)分布式系统的演化过程

上述我们说了redis广泛应用于分布式系统上,那什么是分布式系统,我们来看一下他的演化过程

1.单机架构

  只有一台服务器,这个服务器会处理所有的请求,服务器中分为两个模块一个用来处理应用服务,一个用来处理数据库服务,我们也可以划分成一个模块,由着一个模块来处理业务和数据。

  其实我们大部分公司需求量没有那么大,我们现有的计算机资源即使一台主机也足够应对大部分情况,可以支持很高的并发和数据存储。

2.使用分布式系统   

但是随着业务增长,一台主机可能难以应对如此高的并发请求,所以这时候我们可以引入更多的主机和硬件资源来解决这个问题。 

 一台主机的资源包括很多比如:CPU.内存,硬盘,网络等等,服务器每收到一个请求都会消耗一定的资源,如果在高并发的情况下,我们的服务器无法支持这么多请求,就会导致服务器处理请求的速度变慢,甚至发生错误。

那我们可以通过两种方法来解决:

1.开源:引入更多资源(增加服务器,更换cpu,加内存条等等)

2.节流:通过性能测试,找到那个地方效率不高,进行优化(比较难,需要投入很多的人力物力,也不一定能优化多少)

   所以我们还是想通过开源的方式来解决服务器压力过大的场景,但是我们装过机的应该知道,电脑主板的内存条是有限的,不仅是内存条,其他资源也是有上限的,那一台主机扩展到极限,我们就需要引入多台主机,并且在软件上做出对应的调整和适配就可以解决上述服务器压力大的问题,而这种通过引入多台主机的系统方式,就可以称为分布式系统。

   这时我们可以将应用服务和数据库服务进行分离,根据内部业务的不同加强各自的硬件资源

   比如应用服务器需要处理很多业务逻辑,我们就可以加强他的cpu资源,数据库服务器需要存储大量数据,就可以增加他的硬盘空间

3.应用服务集群架构

   如果我们应用服务器的负载仍然很高,我们就需要在引入多个应用服务器,同时引入一个负载均衡,通过一个负载均衡将业务分给多个应用服务器,假设1w个用户请求,有2个应用服务器,此时按照负载均衡的方式,就可以让每个应用服务器来承担5000的访问量(这个事情和之前的多线程有些类似)。

  上述我们增加了应用服务器,但是所有数据还是要经过负载均衡器,那我们负载均衡器能不能承受住这么多数据?

  实际上负载均衡器对于请求量的承担能力要远高于应用服务器的,因为负载均衡器只是给应用服务器分配业务,并没有对数据进行处理,而且就算一个负载均衡器不够用,我们也可以引入多个。

  但除了负载均衡器,上图也只有一个存储服务器,那我们该如何解决呢?我们仍然可以使用开源,节流的方法,但在这里我们可以根据服务器的特性(存储服务器)来进行划分,我们可以将读写进行分离

   我们将存储服务器分为主服务器和多个从服务器,主服务器一般只有一个,从服务器可以有多个,主服务器用来向服务器进行写操作,从服务器数据同步主服务器,应用服务器访问时,可以更多的从从服务器中读取数据

4.引入缓存服务器(redis)

   mysql数据库最大的问题就是响应速度慢,所以我们可以将数据划分成两部分,一部分是高频使用的一般占20%,但是却能满足我们80%的数据需求,一部分是低频使用的大约占总数据的80%(我们称为28原则),我们可以将高频使用的数据放到缓存中,因为缓存的访问速度对比数据库要快很多

  那为什么要二八分呢,其实也不绝对,根据实际场景和业务的不同,会有差异,而之所以只占20%就是因为缓存虽然快,但是太小了。

   上述我们说,服务器负载过大我们可以引入从服务器来帮主服务器实现读写分离降低负载,那如果服务器的内存不够用了该怎么办?这时我们就可以引入多台主机,每个主机存储一些数据,也就是针对之前的数据库进行拆分(分库分表)

5.微服务架构

   之前一个应用服务器做了很多业务,但是这会导致服务器的代码越来越复杂,所以我们可以将这样的服务器功能进行拆分变成更小的服务器

   那我们为什么要引入微服务,就是因为代码复杂后需要更多人力资源进行维护,当人员多了,就需要配套的管理,将人员分为多个组,每个组分工进行处理所以我们需要将服务器的功能拆分由不同的组进行管理也更方便功能的复用。

   引入微服务付出的代价?

  1.系统的性能会下降:因为我们拆分成更多的服务器,那服务器之间还需要通过网络通信的方式传递数据,而网络通信的速度又很慢。

  2.系统复杂程度变高:虽然引入微服务降低了服务器的复杂程度,但是提高了系统的复杂程度,因为服务器更多,出现问题的概率就会变大,这时候我们还需要别的手段来保证不出错。

(三)一些术语的简单理解

1.应用/系统

一个应用,就是一组服务器程序

2.模块/组件

一个应用中会有很多独立的功能,就可以称为一个模块

3.分布式

引入多台主机/服务器一起完成一系列的工作

4.集群

与分布式一样,不过这里的主机不一定真的是一台计算机也可能是不同程序(逻辑上的多个主机)

5.主/从

分布式中的典型结构,服务器可分为主服务器和从服务器,从服务器中的数据要从主服务器中同步

6.中间件

和业务无关的服务比如:数据库,缓存,消息队列

7.可用性

系统整体可用的时间/总时间,就是我们的可用性

8.响应时长

衡量服务器的性能,同一功能下越小就代表服务器的性能越高

9.吞吐和并发

服务器处理请求的能力,也可以衡量服务器的性能

(四)redis的一些特性

1.In-memory data structrue

   mysql是在硬盘中通过“表”的方式来存储数据,又叫关系型数据,redis是在内存中通过“键值对”的方式存储数据,又叫非关系型数据,redis中键值对里的key都是String类型,而value可以是Strings,hashes,lists,sets等数据结构

2.Programmability

  redis是可编程的,我们针对redis的操作可以直接通过简单的交互式命令来进行操作,也可以通过脚本的方式,批量执行操作,比如我们可以使用Lua

3.Extensibility

  redis是可扩展的,redis只给我们提供了一组api,如果我们觉得redis功能不够强大,我们可以通过扩展的方式,来让redis支持更多的数据结构和更多命令(我们可以使用C,C++,Rust来进行扩展)

4.Persistence

 redis数据是可以持久化的,redis把数据存储在内存上,那我们如果开关机,我们的数据会被清空,这种情况是不允许的,所以redis也会把数据存储在硬盘上,内存为主,硬盘为辅,硬盘就相当于内存的备份,如果计算机重启内存数据丢失,我们就会加载硬盘中备份的数据

5.Clustering

   redis是支持集群的,作为一个分布式系统的组件,既然应用于分布式环境上,就要支持集群,就类似于数据库的“分库分表”,一个redis中存储数据有限,引入多个主机,部署多个redis即可

6.High availability

   redis是高可用的,reids也支持主从结构,就像服务器支持主从服务器一样,从结点就相当于主结点的备份

(五)redis为什么这么快?

1.redis数据存储在内存中,比访问硬盘的数据库快很多

2.redis核心功能都比较简单(操作内存的数据结构)

3.redis进行网络通信时使用IO多路复用

4.redis使用单线程模型(更高版本引入了多线程),减少了不必要的线程竞争引发的开销

那之前我们引入多线程不就是因为要提高效率吗?为什么在这里单线程会更快?

   其实多线程提高效率是通过我们cpu多核资源来的,所以更适用于cpu密集型任务,但是redis核心任务我们也说了,只是操作内存的数据结构,对cpu的消耗不大,所以也就不必引入多线程

(六)redis能做什么

1.数据库

   我们可以将redis作为一个数据库,那什么情况下把redis作为一个数据库呢?大多数情况下,我们首先考虑存储更多的数据而不是效率,但是在一些特定的场景下比如搜索引擎,对于性能的要求就比较高,我们需要把所有检索的数据存储在内存的,就是用类似redis这样的数据库来完成

2.缓存

   上述我们说到的二八原则就是把热点数据拿出来放在redis中,redis存的部分数据,而mysql中存储的才是全量数据,redis数据丢失也可以从mysql中加载回来

3.消息队列

  基于redis这个中间件,我们可以实现一个生产者消费者模型,优势:1.解耦合,2.削峰填谷

4.session存储

  我们知道cookie是用来实现用户身份信息的保存,但是需要session的配合,cookie本质只是在浏览器这边存了一个用户身份标识,真正存用户数据的还是服务器中的session,但是我们可能有很多应用服务器,我们登录一个服务器会给我们一个cookie,但是我们下一次访问时可能负载均衡器会给我们分配到其他的应用服务器上,就需要我们重新登录重新上面的请求

  那如何解决上面的问题?

1.想办法让负载均衡器把同一个用户的请求一直分配到同一个服务器

2.把会话数据单独分配一个服务器(redis)

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

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

相关文章

后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0920)

十三、文章分类页面 - [element-plus 表格] Git仓库:https://gitee.com/msyycn/vue3-hei-ma.git 基本架子 - PageContainer 功能需求说明: 基本架子-PageContainer封装文章分类渲染 & loading处理文章分类添加编辑[element-plus弹层]文章分类删除…

[Python]案例驱动最佳入门:Python数据可视化在气候研究中的应用

在全球气候问题日益受到关注的今天,气温变化成为了科学家、政府、公众讨论的热门话题。然而,全球气温究竟是如何变化的?我们能通过数据洞察到哪些趋势?本文将通过真实模拟的气温数据,结合Python数据分析和可视化技术&a…

Flutter启动无法运行热重载

当出现这种报错时,大概率是flutter的NO_Proxy出问题。 请忽略上面的Android报错因为我做的是windows开发这个也就不管了哈,解决下面也有解决报错的命令大家执行一下就行。 着重说一下Proxy的问题, 我们看到提示NO_PROXY 没有设置。 这个时候我…

基于YOLOv8+LSTM的商超扶梯场景下行人安全行为姿态检测识别

基于YOLOv8LSTM的商超扶梯场景下行人安全行为姿态检测识别 手扶电梯 行为识别 可检测有人正常行走,有人 跌倒,有人逆行三种行为 跌倒检测 电梯跌倒 扶梯跌倒 人体行为检测 YOLOv8LSTM。 基于YOLOv8LSTM的商超扶梯场景下行人安全行为姿态检测识别&#xf…

Vue3.0组合式API:使用ref获取DOM元素

Vue3.0组合式API系列文章: 《Vue3.0组合式API:setup()函数》 《Vue3.0组合式API:使用reactive()、ref()创建响应式代理对象》 《Vue3.0组合式API:computed计算属性、watch监听器、watchEffect高级监听器》 《Vue3.0组合式API&…

【贪心算法】贪心算法一

贪心算法一 1.柠檬水找零2.将数组和减半的最少操作次数3.最大数4.摆动序列 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.柠檬水找零 题目…

【Linux】【Vim】Vim 基础

Vim/Gvim 基础 文本编辑基础编辑操作符命令和位移改变文本重复改动Visual 模式移动文本(复制、粘贴)文本对象替换模式 光标移动以 word 为单位移动行首和行尾行内指定单字符移动到匹配的括号光标移动到指定行滚屏简单查找 /string标记 分屏vimdiff 文本编辑 基础编辑 Normal 模…

Gitlab runner的使用示例(二):Maven + Docker 自动化构建与部署

Gitlab runner的使用示例(二):Maven Docker 自动化构建与部署 在本篇文章中,我们将详细解析一个典型的 GitLab CI/CD 配置文件(gitlab-ci.yml),该文件主要用于通过 Maven 构建 Java 应用&…

07_Python数据类型_集合

Python的基础数据类型 数值类型:整数、浮点数、复数、布尔字符串容器类型:列表、元祖、字典、集合 集合 集合(set)是Python中一个非常强大的数据类型,它存储的是一组无序且不重复的元素,集合中的元素必须…

Games101学习 - 着色

本文主要讲述Games101中的着色部分。 文中将使用UE的UTexture2D接口,若不了解可以看这篇: https://blog.csdn.net/grayrail/article/details/142165442 1.面积比计算三角形坐标 通过三角形面积比可以得到三角形的坐标alpha、beta、gamma从而进行插值&a…

AI技术好书推荐:《AI系统-原理与架构》

今年1月份在B站发现了一个B站宝藏博主,发布的一系列AI技术类科普视频内容很干,逻辑清晰,很多知识点讲的深入浅出,非常有用,被直接种粉。 后来这一系列的课程内容博主有了出书的计划,机缘巧合有幸参与部分章…

CSS入门笔记

目录 概述 组成 CSS 语法 常见的使用方式 CSS 优先级 CSS 选择器 1. 基本选择器 2. 属性选择器 3. 伪类选择器 4. 组合选择器 示例 优先级 边框样式与盒子模型 单个边框 边框轮廓(Outline) 盒子模型 模型介绍 边距设置 布局示例 文…

计算机考研408-计算机网络

【题33】下列选项中,不属于网络体系结构所描述的内容是() A.网络的层次 B.每一层使用的协议 C.协议的内部实现细节 D.每一层必须完成的功能 解析: 本题考查的是网络体系结构相关的概念。 图1描述了网络的7层架构以及每一层所要完成…

Python模块和包:标准库模块(os, sys, datetime, math等)②

文章目录 一、os 模块1.1 获取当前工作目录1.2 列出目录内容1.3 创建和删除目录1.4 文件和目录操作 二、sys 模块2.1 获取命令行参数2.2 退出程序2.3 获取 Python 版本信息 三、datetime 模块3.1 获取当前日期和时间3.2 日期和时间的格式化3.3 日期和时间的运算 四、math 模块4…

代理IP批理检测工具,支持socks5,socks4,http和https代理批量检测是否可用

代理IP批理检测工具,支持socks5,socks4,http和https代理批量检测是否可用 工具使用c编写: 支持ipv4及ipv6代理服务器。 支持http https socks4及socks5代理的批量检测。 支持所有windows版本运行! 导入方式支持手工选择文件及拖放文件。 导入格式支持三…

【我的 PWN 学习手札】劫持 tcache_perthread_struct

目录 前言 一、tcache perthread struct 二、劫持 tcache_perthread_struct 三、测试与模板 前言 tcache 是 glibc 2.26 (ubuntu 17.10) 之后引入的一种技术,目的是提升堆管理的性能,与 fast bin 类似。 tcache 引入了两个新的结构体, tc…

机器学习之非监督学习(四)K-means 聚类算法

机器学习之非监督学习(一)K-means 聚类算法 0. 文章传送1.非监督学习定义2.非监督学习分类2.1 聚类 Clustering2.2 异常检测 Anomaly Detection 3.K-means聚类算法 K-means clustering案例引入算法步骤算法优化成本函数初始化方法K的选择 代码实现 4.案例…

ElementUI 布局——行与列的灵活运用

ElementUI 布局——行与列的灵活运用 一 . 使用 Layout 组件1.1 注册路由1.2 使用 Layout 组件 二 . 行属性2.1 栅格的间隔2.2 自定义元素标签 三 . 列属性3.1 列的偏移3.2 列的移动 在现代网页设计中&#xff0c;布局是构建用户界面的基石。Element UI 框架通过其强大的 <e…

learn C++ NO.17——继承

什么是继承&#xff1f; 用冒号 : 后跟基类名称来声明一个类是从某个基类继承而来的。继承方式可以是 public、protected 或 private&#xff0c;这决定了基类成员在子类中的访问权限。 下面通过代码简单进行一下演示. 派生类Student即子类&#xff0c;而基类Person是它的父…

Ubuntu22.04安装paddle

查看系统版本信息 使用命令lsb_release -a查看系统版本 rootLAIS01:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.5 LTS Release: 22.04 Codename: jammy查看系统支持的cuda版本&#xff0c;使用命令nvidia-smi&#…