后端接口性能差,该从哪些方面进行优化?

961bba6712ee002fb4c4be462195c2f0.png

点击上方蓝字关注我们

1

善于使用异步编程

1、利用多线程实现异步:比较推荐的方式是自定义TreadPool来实现多线程,在Java 8以及8以上的版本,我们也可以使用CompletableFuture来实现异步编程。

2、使用mq中间件实现异步:现在市面上比较流行的分布式消息中间件有rocketmMq,rabbitMq,kafka等,在Springboot的环境中引入相关的消息中间件也比较简单,这里就不再赘述了。

d5891ddaa491f561d07fd581a1b6f778.png

2

数据量大,使用批量与分批操作

1、在查询数据库的时候我们要尽量避免在for循环中操作数据库,尽量使用批量处理来对数据库进行操作。在Mybatis中我们可以使用批量处理器来对数据库进行操作,MybatisPlus甚至为我们封装好了批量处理的API。

2、避免在for循环中进行rpc调用,尽量使用批量查询。

3、如果操作的数据量很大,那么我们可以进行分批处理,这样可以避免一次交互的数据量过大,从而导致接口响应过慢。

ba4adc88c8c7258bb03593fe64e84025.png

3

避免大事务

大事务会带来什么危害?并发情况下,数据库连接池容易被撑爆;锁定太多的数据,造成大量的阻塞和锁超时;执行时间长,容易造成主从延迟;回滚所需要的时间比较长。

如何解决大事务问题?尽量少使用@Transactional注解,虽然它真的很方便,但是声明式事务很难控制好事务的粒度,推荐使用编程式事务来帮助我们更好的控制事务的粒度。Spring给我们提供了TransactionTemplate来帮助我们实现编程式事务。

8f6b31d9973655aee02e8be43a93bd1c.png

123ab6f5a3575bfcbcfde747658bc003.png

4

优化sql慢查询

导致慢查询的原因:

1、关键的字段缺少索引。

2、有索引,但是却没有用上索引。

3、SQL比较复杂,很慢,但是不好优化。如果你的SQL比较复杂,那么建议利用Java代码逻辑来实现对应的逻辑,我们毕竟不是SQL开发,而是后端Java开发,复杂的SQL不仅可能导致慢查询,也不利用后期代码的维护工作。

4、数据表数据很多。如果旧数据用户访问的比较少,我们可以对数据进行冷热分离;对数据进行分库分表,如果表的数据量已经很大了,那么我们可能就需要进行分库分表的处理了。我们可以使用ShardingJDBC,Mycat等成熟的中间件或者代理来帮助我们完成大数据表的分库分表。

b45adb3c70d75b0c89cb113246010edd.png

5

善于利用缓存

对于并发比较高的系统,缓存是非常有必要的。我们可以将一些查询较多,但是修改不频繁的数据放入到缓存中,这样可以帮助我们减少对数据库的访问。这样不仅可以减轻数据库的压力,而且接口的响应速度也可以得到很大的提升。

1、使用Redis作分布式缓存:通常我们会利用Redis作为分布式缓存中间件,但是在使用Redis的时候,我们对key的设计要合理,不然出现Big Key,很有可能影响到我们接口的响应速度。

2、使用Caffeine作为本地缓存:很多时候我们不仅仅会利用Redis做分布式缓存,同时我们也会做一个本地缓存,减轻redis的压力。这里我以caffeine为例,当然还有很多本地缓存的实现,我这里就不一一介绍了.

注:我们生产上的服务都是部署多台机器的,那么当数据修改时,我们如何让本地缓存失效呢?我的一个思路是可以通过Redis的事件发布机制,只要我们所有的服务都订阅Redis的某个事件,一旦数据进行了改动,那么就发布事件,所有订阅了相关事件的服务就可以接收到消息并将对应的缓存删除。另外如果数据的实时性要求不高,我们甚至可以不用删除缓存,只需要过期时间设置短一点即可(例如5s,10s)。

18b97280a0a8a3d4fe0f9114cbea8ca8.png

6

控制好锁的粒度

在并发场景下,很多时候我们都需要使用到锁来帮助我们保证数据的安全性,包括像数据的幂等性处理都需要用到锁。但是如果不管我们使用Sysnchrnoized关键字,jdk的lock锁,还是分布式锁,我们都需要控制好锁的粒度,如果锁的粒度很大,显然会影响到我们系统的吞吐量。

e38c669d594fdeb86ec29dba6c87b40e.png

原文链接

https://juejin.cn/post/7124493348034838542

f435ebb6f46019d106c79db15c87e243.png

点个在看你最好看

f6dc3b0c4f278d4b239b9d7f6cc2cf23.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值