聊聊接口优化的几种方法
Java后端技术
共 8520字,需浏览 18分钟
· 2022-07-23
往期热门文章:
1、3 步完成 Spring Boot 的日志脱敏 2、线上MySQL的自增id用尽怎么办?被面试官干趴下了! 3、求求你别再用 System.currentTimeMillis() 统计代码耗时了,真的太 Low 了! 4、如何将 @Transactional 事务注解运用到炉火纯青? 5、不知道怎么解耦业务?Spring Event 了解一下!
背景
哪些问题会引起接口性能问题?
数据库慢查询 深度分页问题 未加索引 索引失效 join过多 子查询过多 in中的值太多 单纯的数据量过大 业务逻辑复杂 循环调用 顺序调用 线程池设计不合理 锁设计不合理 机器问题(fullGC,机器重启,线程打满)
问题解决
慢查询(基于mysql)深度分页
select name,code from student limit 100,20
select name,code from student limit 1000000,20
select name,code from student where id>1000000 limit 20
慢查询未加索引
show create table xxxx(表名)
慢查询索引失效
某个字段只可能有3个值,那这个字段的索引区分度就很低。 再比如,某个字段大量为空,只有少量有值; 再比如,某个字段值非常集中,90%都是1,剩下10%可能是2,3,4....
select name,code from student force index(XXXXXX) where name = '天才'
join过多 or 子查询过多
in的元素过多
select id from student where id in (1,2,3 ...... 1000) limit 200
if (ids.size() > 200) {
throw new Exception("单次查询数据量不能超过200");
}
单纯的数据量过大
业务逻辑复杂
循环调用
List<Model> list = new ArrayList<>();
for(int i = 0 ; i < 12 ; i ++) {
Model model = calOneMonthData(i); // 计算某个月的数据,逻辑比较复杂,难以批量计算,效率也无法很高
list.add(model);
}
// 建立一个线程池,注意要放在外面,不要每次执行代码就建立一个,具体线程池的使用就不展开了
public static ExecutorService commonThreadPool = new ThreadPoolExecutor(5, 5, 300L,
TimeUnit.SECONDS, new LinkedBlockingQueue<>(10), commonThreadFactory, new ThreadPoolExecutor.DiscardPolicy());
// 开始多线程调用
List<Future<Model>> futures = new ArrayList<>();
for(int i = 0 ; i < 12 ; i ++) {
Future<Model> future = commonThreadPool.submit(() -> calOneMonthData(i););
futures.add(future);
}
// 获取结果
List<Model> list = new ArrayList<>();
try {
for (int i = 0 ; i < futures.size() ; i ++) {
list.add(futures.get(i).get());
}
} catch (Exception e) {
LOGGER.error("出现错误:", e);
}
顺序调用
A a = doA();
B b = doB();
C c = doC(a, b);
D d = doD(c);
E e = doE(c);
return doResult(d, e);
CompletableFuture<A> futureA = CompletableFuture.supplyAsync(() -> doA());
CompletableFuture<B> futureB = CompletableFuture.supplyAsync(() -> doB());
CompletableFuture.allOf(futureA,futureB) // 等a b 两个任务都执行完成
C c = doC(futureA.join(), futureB.join());
CompletableFuture<D> futureD = CompletableFuture.supplyAsync(() -> doD(c));
CompletableFuture<E> futureE = CompletableFuture.supplyAsync(() -> doE(c));
CompletableFuture.allOf(futureD,futureE) // 等d e两个任务都执行完成
return doResult(futureD.join(),futureE.join());
线程池设计不合理
核心线程设置过小:核心线程设置过小则没有达到并行的效果 线程池公用,别的业务的任务执行时间太长,占用了核心线程,另一个业务的任务到达就直接进入了等待队列 任务太多,以至于占满了线程池,大量任务在队列中等待
锁设计不合理
public synchronized void doSome() {
File f = calData();
uploadToS3(f);
sendSuccessMessage();
}
public void doSome() {
File f = null;
synchronized(this) {
f = calData();
}
uploadToS3(f);
sendSuccessMessage();
}
机器问题(fullGC,机器重启,线程打满)
万金油解决方式
缓存
简单的 map
guava
等本地缓存工具包缓存中间件: redis
、tair
或memcached
memcached
现在用的很少了,因为相比于redis
他不占优势。tair
则是阿里开发的一个分布式缓存中间件,他的优势是理论上可以在不停服的情况下,动态扩展存储容量,适用于大数据量缓存存储。相比于单机redis
缓存当然有优势,而他与可扩展Redis
集群的对比则需要进一步调研。回调 or 反查
结语
往期热门文章:
1、线上MySQL的自增id用尽怎么办?被面试官干趴下了! 2、计算机专业会不会成为下一个土木? 3、xxl-job惊艳的设计,怎能叫人不爱 4、ArrayList#subList这四个坑,一不小心就中招 5、面试官:大量请求 Redis 不存在的数据,从而影响数据库,该如何解决? 6、MySQL 暴跌! 7、超越 Xshell!号称下一代 Terminal 终端神器,用完爱不释手! 8、IDEA 官宣全新默认 UI,太震撼了!! 9、让你直呼「卧槽」的 GitHub 项目! 10、Kafka又笨又重,为啥不选Redis?
评论
盘点Lombok的几个骚操作,你绝对没用过!
👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接:http://116.62.199.48/ ,新项目正在酝酿中
小哈学Java
0
堪称最优秀的Docker可视化管理工具——Portainer你真的会用吗?
来源:blog.csdn.net/shark_chili3007/article/details/123366179👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目
小哈学Java
0
JS的这些新特性,你都用过么?
大厂技术 高级前端 Node进阶点击上方 程序员成长指北,关注公众号回复1,加入高级Node交流群作为一门不断演进的语言,JavaScript每年都会引入新特性。这些特性的加入,能够帮助我们编写更加简洁、高效、易于维护的代码。然而,并非所有新特性
程序员成长指北
1
【深度学习】人人都能看懂的LSTM
熟悉深度学习的朋友知道,LSTM是一种RNN模型,可以方便地处理时间序列数据,在NLP等领域有广泛应用。在看了台大李宏毅教授的深度学习视频后,特别是介绍的第一部分RNN以及LSTM,整个人醍醐灌顶。本文就是对视频的记录加上了一些个人的思考。0. 从RNN说起循环神经网络(Recurrent Neur
机器学习初学者
0
我发现 Lombok的几个骚操作,哈哈好用
大家好,我是小富~前言本文不讨论对错,只讲骚操作。有的方法看看就好,知道可以这么用,但是否应用到实际开发中,那就仁者见仁,智者见智了。一万个读者就会有一万个哈姆雷特,希望这篇文章能够给您带来一些思考。耐心看完,你一定会有所收获。@onX例如 onConstructor, oMet
程序员内点事
0
测试新人,如何快速上手一个陌生的系统!
大家好,我是狂师!作为刚入行不久的测试新人,面对一个陌生的系统时,可能会感到有些手足无措。面对一个全新的系统系统,如何快速上手并展开有效的测试工作是一个重要的挑战。本文将探讨测试新人如何通过一系列步骤和策略,快速熟悉并掌握新系统的测试要点,从而提高测试效率和质量。本文旨在为测试新手提供一份指导,帮助
测试开发技术
0
如何计算数据中心的冷却需求?
今日分享 【导读】数据中心的冷却要求受多种因素影响,包括设备的热量输出、占地面积、设施设计和电气系统功率额定值等等……众所周知,环境因素会严重影响数据中心设备。过多的热量积聚会损坏服务器,可能导致其自动关闭。经常在高于可接受的温度下运行服务器会缩短其使用
数据中心运维管理
0
多人同时导出 Excel 干崩服务器!新来的阿里大佬给出的解决方案太优雅了!
点击关注公众号,Java 干货及时推送↓推荐阅读:面试辅导,我们出大成果了!来源:juejin.cn/post/7259249904777838629前言 业务诉求:考虑到数据库数据日渐增多,导出会有全量数据的导出,多人同时导出可以会对服务性能造成影响,导出涉及到mysql查询的io操作,
Java技术栈
1