思路
1、数据库读写分离
1.1、介绍
- 在实际的项目中,我们对读的操作是大于写操作的,如果读写都在一个库的情况下,写操作会锁行数据,这个时候查询数据库就会很慢,非常影响性能,而且数据库读写切换也是非常耗性能的。
- 读写分离后,对数据库的读操作去读库,写操作去写库,会提高高并发的数据库访问性能,但是也有风险,什么风险呢,因为读库的数据是从写库通过过来的,当读一个数据的时候,写库的数据还没有同步过来,这个时候就会产生错误数据。
1.2、案例(细节https://blog.csdn.net/zhou920786312/article/details/97813954)
- 我以前接手一个项目,项目的是数据库是读写分离的,其中有个插入数据到数据库,并查询插入id的操作。
- 将数据插入数据库(主键自增长)
- 查询当前连接插入的最大id( LAST_INSERT_ID)
- 它查到的id不是当前插入的数据库id,因为写库的数据还没有同步到读库,所以我们查到的数据不是插入数据的id。
2、分离静态资源
- 在web项目中,加载图片是非常耗资源的。通常我们会把图片放到图片服务器,并针对图片资源进行加速。
- 将大图片分割多个小图片,开启多个线程进行操作,最后多各个进程的处理结果进行汇总处理。
- 同理针对js,css,zip文件我们可以做专门的处理
3、cdn加速
- CDN加速就是在靠近用户的物理位置上架设服务器,根据就近原则让用户访问物理上最近的服务器来节省网络传输时间。
- 作用降低网络传输时间
4、用户请求,数据预处理
4.1、介绍
- 我们把一次HTTP请求的时间分成3段:请求–> 计算处理–> 响应。那么我们能专门优化呢。
- 请求:数据压缩传输,降低网络传输时间
- 响应:数据压缩传输,降低网络传输时间
- 计算处理:预先处理好结果,并将结果缓存起来,当用户请求的时候直接返回处理结果。
4.2、介绍案例
- 我刚参加工作的那会,我接手一个项目,优化用户登录模块。
- 用户登录,做了登录校验,校验成功后
- 获取用户的基本信息
- 获取用户的零钱信息(我们有自己的购物商场)
- 获取用户物流地址信息
- 获取用户帖子信息(用户发帖)
- 获取用户等级信息(类似qq的等级)
- 还有一大堆的用户信息。
- 上面的操作是如此的多,而且有些表数据是非常大(单表查询,单表性能高),造成用户登录非常耗时
- 针对上面的情况,我做了优化如下
- 针对固定的数据,如用户基本信息,我放到缓存中,不去数据库查询,这样减少数据库的请求压力
- 针对那些会变化,但是变化间隔时间很大的数据,放到缓存,比如物流地址
- 正对那些需要返回的实时数据,比如用户帖子信息(其他用户对帖子的评论),我开启一个定时任务,间隔时间更新用户帖子信息,并把帖子信息放到缓存中,当用户请求帖子接口,不去操作数据库,直接从缓存响应并给出结果。
- 具体实施(核心是建立用户的内存模型)
- 建立用户的内存模型
- 公共数据的内存模型
- 具体用户特殊的内存模型
- 模块
- 业务
- 登录
- 用户基本信息
- 零钱
- 用户零钱信息
- 帖子
- 用户发帖数信息
- 用户评论数信息
- 登录
- 业务
- 模块
- 建立用户的内存模型
- 用户登录,做了登录校验,校验成功后
5、缓存
- 使用缓存核心目的是为了减少对数据库的访问压力
- 后期服务器的主要压力在数据库压力上
6、负载均衡
- 使用集群环境
- 目的是将访问请求平均分给各个服务器上
- 核心:使各个服务器的压力平均
7、分布式服务器集群
7.1、文件服务器集群
- 图片、视频、其他下载文件,它们的下载通常会占用大量的网络带宽。
- 图片、视频、其他下载文件,会消耗业务服务器的cpu资源,导致业务功能延迟。
- 文件划分为一个单独服务器,不会影响业务服务器带宽,不会影响业务服务器cpu资源消耗。
- 提供高可用的对外访问地址(负载均衡)
7.2、业务服务器集群
- 连接并发数= 各个服务器并发数之和
- 提供高可用的对外访问地址(负载均衡)
7.3、数据库服务器集群
- 不仅提高访问性能
- 保证了数据安全完整性能。