专栏推荐
- 专门为Redis入门打造的专栏,包含Redis基础知识、基础命令、五大数据类型实战场景、key删除策略、内存淘汰机制、持久化机制、哨兵模式、主从复制、分布式锁等等内容。
链接>>>>>>>>>
《Redis从头学》 - SpringBoot实战相关专栏,包含SpringBoot过滤器、拦截器、AOP实现日志、整合Freemaker、整合Redis等等实战相关内容,多篇文章登入全站热榜、领域热榜、被技术社区收录。
链接>>>>>>
《SpringBoot实战》
🌟前言
身为一个合格的开发者,在系统开发时不仅仅是要考虑功能的实现,还要考虑接口性能以此来提升用户体验、节省硬件成本。本文总结了系统开发中常见的接口性能优化手段。
🌟异步思想
在这之前先介绍一下同步和异步:
- 同步:用户请求时,逻辑中所有的操作完成之后才返回给用户信息。
- 异步:用户请求时,逻辑中的部分操作可以另辟蹊径去完成,减少用户等待时间。
举个例子,比如说在采集用户日志时,见下图的同步操作:
在此接口经过一系列复杂逻辑操作耗时很长,那么怎么优化呢?是不是经过最后一个逻辑处理就可以响应给用户信息?于是可以采用异步思想的去解决,常见的解决方案据我经验有两类:
- 编程语言工具:Java中的Future和Callable、CompletableFuture、Spring框架中的@Async。
- 中间件:消息队列中间件。比如说针对上述可以采用kafka进行异步。至于采用何种MQ根据业务需求选择即可。
🌟池化思想
在开发中见识过的比如说对象、连接、线程(统称为资源)都可以进行池化,以此来提升系统资源利用率。在优化时可以接口类型对资源进行池化,我在这里总结了两类:
- 网络请求:在对接第三方接口时需要发起http请求或者数据库连接,这时候我们可以采用对连接进行池化。比如基于Http实现请求调用常见的有HttpClient、OkHttp、Restemplate,我们可以对其进行池化提升接口性能。
- IO请求或者CPU操作:接口在涉及IO请求、CPU调度时就可以对内存或者线程进行池化,也就是我们常用的线程池ThreadPoolExecutor、ThreadPoolTaskExecutor(spring中)。
🌟缓存思想
在系统开发中缓存一共有两类:
- 本地缓存:
- HashMap-线程非安全
- ConcurrentHashMap-线程安全
- LinkedHashMap-非线程安全
- MyBatis二级缓存
- 缓存框架:Guava、Caffeine
- Nginx缓存
- 分布式缓存:
- Redis
- Memcached
注意:在使用分布式缓存时要注意缓存一致性问题。
🌟数据库优化
- SQL参数调整
- innodb_buffer_pool_size:增大该参数值可以增加InnoDB存储引擎的缓冲池大小,提高查询性能。
- max_connections:增大该参数值可以增加数据库的最大连接数,以支持更多的并发查询。
- wait_timeout:减小该参数值可以释放空闲连接的资源,以提高连接的利用率。
- slow_query_log:启用慢查询日志,以记录执行时间超过阈值的查询语句,便于优化。
- log_queries_not_using_indexes:启用该参数可以记录未使用索引的查询语句,用于优化查询语句。
- 索引优化
- 数据库表结构优化
- SQL语句优化
- 分库分表优化(数据量大)
🌟组合优化
组合优化就是采用上述几种的组合了,或者说可以提高硬件性能。
🌟写在最后
有关于项目接口性能优化方案到此就结束了。感谢大家的阅读,就我目前个人经验而言只能提供这几种思路了,希望有大佬可以在评论区做出补充!