文章目录
- 认识Redis
- Redis和MySQL
- Redis的场景
- Redis的设计
- 分布式
- 单机架构
- 应用数据分离架构
- 应用服务集群架构
认识Redis
在开始Redis学习前,要先认识一下Redis
Redis的设计,是想要把它当做是一个数据库,一个缓存,或者说是一个消息中间件等,它的主要目的是可以在内存当中进行数据的存储
那么现在问题是,对于数据库来说,应该已经有MySQL这样的内容,那为什么还需要有Redis来作为一个数据库呢?
Redis和MySQL
不可否认,MySQL确实是一个很不错的数据库软件,但是它最大的问题在于,它的访问速度比较慢,这个慢是相较于在内存当中的,因为MySQL本质上是存储在磁盘上的,而如果使用Redis作为数据库,必然会比在磁盘上要快很多,因为这是在内存当中的
但是Redis就一定比MySQL要强吗?这必然也不是的,Redis和MySQL比起来最大的劣势在于,它的存储空间是有限的,这是一个很严重的问题,这就意味着,虽然有很多需要用到高性能的地方,但是终究是少数,大多数的业务其实都不需要用到特别高的性能
那么有什么特别好的方案呢?可以中和一下Redis和MySQL的优点,并且还能有一个比较好的解决方案?那就是把Redis和MySQL结合起来进行使用,也就是我们平时所说的二八原则
二八原则
所谓二八原则,说的是20%的热点数据可以满足80%数据的要求,所以一个比较好的解决方案是,如果能够把MySQL当中比较常用的数据缓存到Redis当中,这样就能对于大多数的请求都能得到数据,而对于不常用的数据再到对应的磁盘去读取,这就是一个比较不错的解决方案
Redis的场景
Redis是工作在分布式系统中的,它在这个环境中才能发挥出它应有的实力,如果只是单纯的单机程序,那么本质上来说如果使用变量来进行数据的存储其实是一个比较不错的解决方式,此时其实是比使用Redis更加优秀的选择
我们在学习操作系统的时候知道,在进行进程的通信时,不能直接进行数据的访问,这是因为进程和进程之间是可以进行数据的隔离的,数据要被进程进行隔离的,而有一种进程通信是借助网络进行通信,所以Redis本质上来说就可以把自己内存中的变量给其他的进,甚至可以直接用其他主机的进程来进行数据的访问,这样就解决了刚才所说的场景,这也是Redis的一个使用场景
Redis的设计
Redis设计的初心,是打算把它当做一个消息中间件来进行处理的,也就是所谓的消息队列,这样就可以在分布式系统下使用一个生产者消费者的模型,但是遗憾的是,现在很少有这样的使用场景,反而是有更加专业的消息中间件来取代Redis的功能,不过Redis依旧是被使用十分广泛的中间件
分布式
前面聊完了Redis的基本认识,那么下面就要简单对于分布式进行一个认识了
单机架构
在进行了解分布式之前,先了解一下什么是单机架构
如上所示就是一个单机架构,对于单价架构来说,就是只有一台服务器,这个服务器可以负责处理所有的工作
我们假设这是一个电商网站,那么这个应用服务其实就是我们写的一个服务器程序,比如说有前面写的一个C++的httplib这样的程序,而这样的HTTP服务器是可以和MySQL数据库的服务进行结合起来的,那么对于MySQL来说,它本质上其实是一个客户端服务端结构的高层许,本体上是一个MySQL的服务器,这个服务器来负责进行数据的存储和组织的部分
而在大多的项目中,其实使用的就是这种比较典型的单机架构,单机架构的特点其实就是简单,并且由于现在计算机的硬件已经发达到了一定的程度,所以哪怕只有一个主机,其实已经是可以有比较高的性能了,可以支持比较大的并发和数据的存储
但是事实上,当业务到达一定程度的时候,其实一个主机已经很难进行处理了,那么就需要用到的是主机,其实本质上是硬件资源
一个主机上的硬件资源是有限的
这句话其实很好理解,因为在一台主机上,它的硬件资源包括但不限于有CPU,内存,硬盘,网络等等,当服务器收到请求的时候,其实都是需要消耗这些资源的,在同一时刻,如果处理的请求比较多,那么就会造成此时的某个硬件资源就不够用,那这是一个比较大的问题,对应该如何进行解决呢?
开源和节流
解决方式也比较简单,开源或者节流,下面一一进行分析
对于开源来说,其实就是新增一些新的硬件资源,比如说可以引入更大的内存,或者新加一些内存条等,但是这样的设计也是有问题的,因为一个硬件的数量是有限的,这就意味着,一个主机的性能是有上限的,当我们需要的性能到达这个瓶颈的时候,本质上就需要新增主机来进行资源
从某种意义来说,如果一旦引入了多台主机,就可以把系统称之为分布式系统了
对于节流来说,就需要用到一些专业知识来对于数据进行优化,需要对于性能测试来看到底是哪个模块出现了问题,这一般需要比较高的水平
应用数据分离架构
所以就引出了下面的这种架构体系模式,可以把应用服务器和存储服务器分开,例如:
下面分开来看这两个模块:
应用服务器:
对于应用服务器来说,里面可能包含有很多的业务,这些业务都会需要进行CPU和内存的资源
数据库服务器:
对于这种服务器来说,它就需要更大的磁盘空间,更快的数据访问速度,因此可以搭配有对应的SSD硬盘等
把这两个服务器进行分离,就可以到达一个更高的性价比
应用服务集群架构
应用服务器通常来说比较吃CPU和内存,那么如果CPU和内存都被吃掉了,那此时应用服务器就无法满足要求了,那此时怎么办?
其实一个比较好的解决措施就是多来几个应用服务器即可,这样就可以解决这样的问题,具体的设计模式如下所示:
看起来是两个应用服务器,实际上也可能是多个应用服务器,而对于应用服务器来说,用户的请求实际上会优先到达负载均衡器或者是网关服务器,之后会被分配到每一个应用服务器,所以这也就使得会诞生很多种不同的算法,来进行合适的分配
假设现在有1w个请求,经过分配后就可以让每一个服务器去分担5k个,这样就实现了分配的道理