第 1 条:串行改并行
将接口中非依赖的步骤由串行改为并行。
通常咱们写接口是串行执行的,比如商品详情接口,如下
- 根据商品ID查询商品基本信息
- 根据商品ID查询商品评论信息
- 根据商品ID查询商品详细描述信息(商品描述大字段放在独立的表中)
这些步骤之间是没有依赖的,可以将这 3 个步骤改为并行执行,比如使用线程池同时去执行这 3 个步骤,效率将会提升不少。
第 2 条:将多表连接查询改为多次单表查询
这里要修正很多开发者的一个误区:很多人觉得查询的次数越多越耗时。
这里要看什么查询,多次单表查询有时候比一条复杂多表连接查询要快不少的。
这里强烈建议大家在开发中尽量去减少连接查询的使用,把多表查询改成多次单表查询,让单表查询都能够走索引,大家可以试试,效率会让你惊讶的。
第 3 条:数据库使用索引
开发中写每个 sql 的时候,都需要考虑一下这条 sql 的性能,尽量让 sql 能够走索引,这样才能提升查询的效率,这里建议大家多了解了解数据库索引的原理和用法。
第 4 条:大事务改小事务
将大事务改成多个小事务执行,或者将大事务改为小事务,将事务中非必要的操作提取到事务之外执行。
比如有些开发者将一些无关紧要的步骤也丢在事务中执行,这样延长了事务执行的时间,事务中一些增、删、修改有时候会锁表,导致并发性能降低,从而导致接口性能降低。
比如有些开发者在事务中去做查询,那么可以将查询提取到事务外面去执行,将查询出来的数据再传递到事务中进去。
第 5 条:减少锁的执行时间
锁会导致并发量降低,已获取锁的会导致其他需要获取锁的处于等待状态,从而导致执行时间变长。
所以要尽量想法降低锁的时间:
- 使用读写锁,减少锁的冲突事件,从而提升性能
- 将一大块代码的锁改为多次小段代码的锁
在事务中将锁表操作放在代码的最后执行,比如 insert、update、delete 尽量放在最后执行,减少锁执行的时间,可以大大提升接口效率
第 6 条:异步化
将业务中非必要的步骤异步化。
比如电商中的下单送积分的操作,可以将送积分的操作异步化,下单成功之后发送一条 MQ 消息,积分服务依靠消息异步进行处理。
异步化的一些方法:借助 MQ 异步化
-
第 7 条:限流,快速失败
有时候,我们的机器性能有限,某个接口只能够支持并发 100 的请求,那么你要做的就是要限流,而不是将所有的请求都放进来,最终影响到所有接口的性能,超过了接口最大能力的请求,应尽量让其失败,使用限流工具,拦截这些请求,快速提示:系统繁忙,请稍后再试;这种效果更好,而不是让用户在那长时间等待后还是失败。
第 8 条:加缓存,提升接口响应速度
缓存是一个很好的东西,一定要用起来的,对于并发量大的接口,缓存真的可以为其带来质的飞跃,比如商品详情页,这里面很多信息是长时间不会变化的,可以将其丢到缓存中,效率将大幅提升。
第 9 条:服务横向扩容
单台服务器性能有限,那么我们可以横向扩容咱们的服务,目前服务已经可以非常容易的根据流量做到自动扩容缩容了,建议大家了解下容器化微服务自动扩容缩容。
第 10 条:分库分表+读写分离
系统中数据库最可能成为瓶颈,主要有 2 个瓶颈
数据量太大,导致查询缓慢,这个可以依靠分表解决,单表数据量降下来之后,可提升查询效率。
- 单库性能是有上限的,比如连接数,破解这个,可以采用分库+读写分离来解决。