前言
在学习 Java 后端开发的过程中,我们已经接触到了 MySQL 数据库,也逐渐了解了 Spring Boot 如何接收用户的 HTTP 请求、处理业务逻辑以及访问数据库。
但是,随着网站用户数量不断增加,后端系统需要处理的请求也会越来越多。
这时,我们就需要考虑几个问题:
-
如何让后端更快地读取数据?
-
当数据库需要处理大量请求时,应该怎么办?
-
如果一台服务器的性能不够,能不能增加服务器?
-
多台服务器如何共同完成一个系统的工作?
这些问题就涉及我们接下来要学习的两个重要知识:Redis 和 分布式系统。
一,什么是Redis
Redis是一个开源的,基于内存的数据存储系统,可以理解为专门用来快速存储数据的数据库,那什么是基于内存存储:计算机的数据可以存储在不同的位置(内存和硬盘),内存 :通畅访问速度快,但是容量小,断电后普通内存中的数据会丢失;硬盘:访问速度较慢,但是容量大,并且能保证在断电后保存数据;Redis就是在内存中进行数据读写的,这也是高性能的体现
二,Redis和MySQL的对比
他和我们学习的MySQL不大一样,MySQL是使用表结构保存数据,而Redis是通过键值对的形式存储的
两者的主要区别如下:
| 对比 | MySQL | Redis |
|---|---|---|
| 数据组织方式 | 关系型表结构 | Key-Value 等数据结构 |
| 主要读写位置 | 内存缓冲区与磁盘 | 内存 |
| 访问性能 | 适合复杂查询和可靠的数据管理 | 非常适合快速读写 |
| 数据持久化 | 以持久化存储为核心 | 支持持久化,但取决于配置 |
| 常见作用 | 保存业务数据 | 缓存热点数据、快速数据访问 |
一般在实际开发中是MySQL跟Redis一起配合使用的,因为各有优缺点的
三,为什么需要Redis
例如用户访问一个电商网站,最开始的访问流程就是打开页面,然后spring boot接收http请求,查询MySQL,然后MySQL返回商品数据,spring boot再返回响应,最终用户就可以看到商品了,但是有一个问题就是我们一些热门的商品,查询的结果一般都是一样的,都是那几个热门的,那为什么还需要每次都来重新访问一边MySQL呢,因为在实际业务中,20%的热门商品往往承担了80%的访问量,也就是二八原则 ,所以如果当我们将这些热门的数据保存在一个读取速度更快的地方,那就可以避免多次没必要的查询,也就引出了缓存思想
**什么是缓存:**缓存可以理解为是将经常访问的数据保存在一个访问速度更快的地方,以便下一次直接获取,因此我们Redis就承担一部分高频的数据读取请求,MySQL负责保存重要的业务数据,然后两个进行配合,虽然也会引发一些问题,例如数据的同步性,我MySQL里更新了数据,但是我Redis还是原来的,这些问题后面会讲到
四,什么是单机架构
单机架构顾名思义就是一台主机承担整个系统的工作,就拿电商网站举例,我们后端一般是有两个重要的部分组成的,应用服务(接受请求,我们前面学习到的spring boot就可以拿来用来应用服务开发)以及数据库服务(保存数据),这两个在软件功能上面是两个不同的部分,但是在单机架构中,他们可以同时运行在一台主机上,一般用于访问量不是很高的情况,那单机架构存在什么问题呢:随着用户的不断增多,我们一台主机需要完成的任务也就更多,但是一台主机的硬件资源是有限的,就比如CPU,内存,硬盘,网络,请求过于多了,就会出现争抢资源的情况,响应速度也就大打折扣了,那如何进行改进一种是升级硬件,一种是优化软件
| 资源 | 作用 |
|---|---|
| CPU | 执行计算和处理任务 |
| 内存 | 保存程序运行所需的数据 |
| 硬盘 | 持久化保存数据 |
| 网络 | 发送和接收数据 |
升级硬件
例如增加CPU的核心数,增大内存,换更好的网络带宽,但是还是无法避免一台主机的升级不可能无限的升级,并且不断升级的情况下,成本也更高了
优化软件
就是程序上减少一些不必要的多余的计算,提高资源的利用率,但是软件优化同样存在着上限,并且难度也是很大的
介于上面的情况,我们引出了分布式架构
五、什么是分布式系统?
可以理解为是将系统中的计算,存储或其他任务分配到多台相互连接的计算机上,由他们共同协作完成整体工作
第一步:应用服务器与数据库服务器分离
就像我们刚刚讲的电商网站,我们可以将应用服务跟数据库服务放在不同的服务器上,这样应用服务器只要负责处理请求跟执行代码,数据库服务器主要负责数据存储以及数据库查询,因为这两个服务对于硬件资源需求不同,前者可能需要更多的cpu以及内存资源,后者需要更多的内存,磁盘空间等,这样布置就可以减少资源的竞争,那这样分离之后,问题真的解决了吗?并没有,因为请求还是在同一台设备上,假设我们用户激增,cup跟内存资源就会达到瓶颈,那我们很容易就可以想到说增加一台应用服务器,让两台服务器一起共同的处理请求,现在就会变成这样

这样可能就会出现一个新问题,请求应该发给哪一个服务器,这里提到了一个负载均衡
什么是负载均衡?
负载均衡的作用就是将进入系统的请求,按照一定的策略分配给不同的服务器进行处理,这里面是有一定的算法以及方式的
总结
基于上面的这些升级硬件,软件,引入多台主机,分布式以及负载均衡机制,我们就能很好的处理更多的请求数据了
那总结一下MySQL以及Redis都能做什么
| 能力 | MySQL | Redis |
|---|---|---|
| 独立进程运行 | ✅ | ✅ |
| 通过网络访问 | ✅ | ✅ |
| 多台服务器共同连接 | ✅ | ✅ |
| 不同进程共享数据 | ✅ | ✅ |
| 跨主机读取和修改数据 | ✅ | ✅ |
| 快速处理简单的内存数据操作 | 可以,但不是主要设计重点 | 特别擅长 |
| 复杂 SQL 查询与关系型数据管理 | 特别擅长 | 不擅长 |
因此,跨进程通信、网络访问、数据共享,都不是 Redis 独有的能力。只是他们的适用场景不一样,那种场景可以发挥Redis真正的实力:在多个服务需要频繁访问共享数据的场景中,Redis 的内存访问性能和专门的数据操作能力,可以发挥很大的作用