(一).前言
在介绍Redis之前,还是先来介绍一下服务端⾼并发分布式结构演进之路。首先了解一下基础的概念
(二).基础概念
1.应用/系统
为完成一整套服务的一个程序或者一组相互配合的程序群。
2.模板/组件
当应用比较复杂时,为了分离职责,将其中具有清晰职责的,内聚性强的部分,抽象出概念,便于理解。
3.分布式
系统中的多个模块被部署于不同服务器上,既可以将系统称为分布式系统。例如,Web服务i去于数据库分别工作在不同的服务器上,或者多台Web服务器被分别部署在不同的服务器上。
4.集群
被部署于多台服务器上的,为了实现特定功能的一个/组特定的组件,整个整体被称为集群。
分布式vs集群
分布式强调的是物理形态,即工作在不同服务器上,并且通过通信配合完成任务;
集群更在意逻辑形态,即是否为了完成特定的服务目标。
5.主/从
汲取那种,通常有一个程序需要承担更多的职责,被称为主;其他承担附属职责的被称为从。
例如,在MySQL集群中,只有一台服务器上数据库允许进行数据的写入(增,删,改),其他数据库的数据修改全部要从这台数据库同步而来,则把那台数据库称为"主库",其他数据库被称为从库
6.中间件
一类提供不同应用程序用于相互通信的软件,即处理不同技术,工具,数据库之间的桥梁。
(三).评价指标
1.可用性
可用性,指的是,考察单位时间内,系统可以正常提供服务的概率。例如,年化系统可用性=系统正常提供服务时长/一年总时长。
2.响应时长
指的是用户完成输入到系统给出用户反映的时长。
3.吞吐vs并发
吞吐考察单位时间段内,系统可以成功处理的请求的数量。并发指的是系统同一时刻支持的请求最高量。
(四).架构推进
1.单机架构
初期,由于用户访问量很少,没有对性能,安全等提出很高的要求,并且系统架构简单,所以选择的是单机架构。

单机架构,指的是,只有一台服务器,这个服务器负责所有的工作。
但是,随着用户量和数据量慢慢的增多,一台主机就慢慢的难以应对,此时,一般有两种方式,第一种方式是"节流","节流"指的是在软件上进行优化,需要通过性能测试,找出是哪个环节出现了平静, 再去优化。
第二种方式就是"开源",直接增加更多的硬件资源,引入更多的主机,但是,一旦引入了多台主机,那么,系统的复杂度就越来越高了,出现bug的概率也就越来越高了。只要引入了多台主机,此时这个系统就可以被称为**"分布式系统"**。
2.应用服务和数据库服务分离

此时,在应用程序中,里面包含了很多的业务逻辑。数据库服务器,需要更大的硬盘空间,更快的数据访问速度。
3.应用服务集群架构

如果用户的访问量持续上升,此时就需要引入更多的应用服务器。
"负载均衡器"负责进行管理,把任务分配给每个应用服务器。
例如,现在有1w个用户请求,有两个应用服务器,此时按照负载均衡的方式,就可以让每个应用服务器承担5000的访问量,和"多线程类似"
负载均衡器对于请求量的承担能力,是远远超过应用服务器的。但是也会有负载均衡器扛不住的,此时就可以引入更多的负载均衡器
4.读写分离/主从分离架构
随着用户的访问量逐渐增多,无论扩展多少台服务器,这些请求最终都会从数据库读写数据,此时就意味着数据库的压力也就逐渐增多了,那么就需要引入更多的服务器,并且可以将一台服务器作为"主数据库服务器",其他服务器作为"从数据库服务器"。主数据库只负责增删改操作,从数据库只负责读数据,即读写分离,主从分离。

主服务器一般只有一个,从服务器可以有多个,同时"从数据库"通过负载均衡的方式,让应用服务器进行访问。
5.引入缓存---冷热分离架构
即使引入的数据库服务器再多,数据库始终有一个天然的问题,就是响应速度慢。
此时,可以把数据区分为"冷热",将"热点数据"放到缓存中,缓存的访问速度比数据库要快很多。

对于"缓存服务器"来说,它存放的只是一小部分热点数据(会频繁用到的数据)。
6.分库分表
引入分布式系统之后,除了要能够应对更高的请求量,同时也要应对更大的数据量。
如果数据量持续增长,导致,多台主机也存不下。此时,可以对数据库进行进一步的拆分,即"分库分表"

本来一个数据库服务器,这个数据库服务器上有很多数据库,那么现在就可以引入多个数据库服务器,每个数据库服务器存储一部分数据库。
如果一个表特别大,此时也可以针对表进行拆分,具体如何拆,需要根据具体的业务场景进行拆分
7.微服务架构
之前的应用服务器,一个服务器程序中作何很多的业务,这就可能导致一个服务器代码变得越来越复杂。为了更方便代码的维护,就可以把一个复杂的服务器,拆分成更多的,功能更单一,但是更小的服务器,即"微服务"

一旦引入了微服务,这就意味着,服务器的种类和数量就增加了。当服务器复杂了,那么就会需要更多的人来维护,一旦人多了,就需要配套的管理,把这些人组织好,划分组织结构,分成多个组。
但是,微服务也有缺点。一旦引入微服务,就意味着,系统的性能下降了,因为拆出来的更多的服务,多个功能之间要更依赖网络通信,此时,如果想要性能不下降太多,只能引入更多的硬件资源。
同时,引入微服务,系统的复杂程度提交了,可用性会受到影响,服务器更多了,那么问题的概率就更大了,此时就需要一系列手段,来保证系统的可用性