
代码重构等优化
文章平均质量分 70
AlbenXie
这个作者很懒,什么都没留下…
展开
-
从3s到25ms!看人家的接口优化技巧,确实很优雅!
批量思想:批量操作数据库,这个很好理解,我们在循环插入场景的接口中,可以在批处理执行完成后一次性插入或更新数据库,避免多次 IO。//for循环单笔入库insert();});//批量入库JVM为Vector扩充大小的时候需要重新创建一个更大的数组,将原原先数组中的内容复制过来,最后,原先的数组再被回收。可见Vector容量的扩大是一个颇费时间的事。通常,默认的10个元素大小是不够的。你最好能准确的估计你所需要的最佳大小。更正:自己设定初始大小。转载 2023-05-02 01:27:29 · 341 阅读 · 0 评论 -
RabbitMQ实现订单超时案例
DelayQueue是java并发包下的延时阻塞队列,常用于实现定时任务。DelayQueue是一个支持延时获取元素的无界阻塞队列。里面的元素全部都是“可延期”的元素,列头的元素是最先“到期”的元素,如果队列里面没有元素到期,是不能从列头获取元素的,哪怕有元素也不行。也就是说只有在延迟期到时才能够从队列中取元素。DelayQueue主要用于两个方面:- 缓存:清掉缓存中超时的缓存数据- 任务超时处理DelayQueue实现了BlockingQueue,所以它是一个阻塞队列。转载 2023-04-23 11:04:32 · 1030 阅读 · 0 评论 -
EasyExcel 遭遇 java.io.IOException: Zip bomb detected
在报错代码上一行加上,问题得以解决(阅读报错信息,发现 ratio: 0.009999633802473054,而Limits: MIN_INFLATE_RATIO: 0.01,setMinInflateRatio() if you need to work with files which exceed this limit)在网上搜索其他两种设置: 代表将接受所有可能的比率。转载 2022-12-19 16:12:19 · 4585 阅读 · 0 评论 -
关于架构师的一点思考
但是,这个程序还是被推倒了,当然也有其公司派系斗争的因素在里面。但是,不得不引起我们的注意,这个程序败就败在了太拘泥于细节,而忽略了顶层设计被客户牵着鼻子走,想知道客户自己说什么吗?某公司,建立的程序又被推倒,外人觉得很奇怪,这个程序的主管非常敬业,关注到了程序每一个细节,甚至包括每一个按钮的文字和位置。可以从看似复杂的东西中找到共性,抽象出共性的东西,以最直接和最简洁的方案通过逻辑构造出千奇百怪的应用结构!这个主管很委屈,他说,他完全是按照客户需求制作的,客户怎么说的,他就怎么做了,难道有错?原创 2022-11-29 07:18:18 · 177 阅读 · 0 评论 -
RestTemplateUtil工具类
【代码】RestTemplateUtil工具类。转载 2022-11-28 20:49:39 · 1270 阅读 · 0 评论 -
SDK和API的区别
SDK的封装是在客户端层面的一个library(也叫做“包”或者“库”),这个library提供一些客户端API接口,类似于已经写好了的函数,你只需要调用它就好了。SDK暴露出来的接口都是和语言相关的,如果SDK是用Java写的,就需要用Java去调用那个函数;API是封装在服务端层面的library,从网络服务的层面暴露出一些API接口,提供给使用这些服务的人去调用。因为封装在服务的层面,传输数据用的是网络协议(常用HTTP/TCP),就不需要管他是用什么语言实现的;原创 2022-11-28 15:50:10 · 501 阅读 · 0 评论 -
Mybatis的关联的嵌套 Select 查询中的N+1问题
你执行了一个单独的 SQL 语句来获取结果的一个列表(就是“+1”)。对列表返回的每条记录,你执行一个 select 查询语句来为每条记录加载详细信息(就是“N”)。这个问题会导致成百上千的 SQL 语句被执行。有时候,我们不希望产生这样的后果。转载 2022-10-18 17:00:21 · 694 阅读 · 1 评论 -
Apache 架构师总结的 30 条架构原则
本文作者叫 Srinath,是一位科学家,软件架构师,也是一名在分布式系统上工作的程序员。他是 Apache Axis2 项目的联合创始人,也是 Apache Software 基金会的成员。他是 WSO2 流处理器(wso2.com/analytics)的联席架构师。Srinath 撰写了两本关于 MapReduce 和许多技术文章的书。他获得了博士学位。来自美国印第安纳大学。Srinath 通过不懈的努力最终总结出了 30 条架构原则,他主张架构师的角色应该由开发团队本身去扮演,而不是专门有个架.转载 2022-03-15 15:36:41 · 242 阅读 · 0 评论 -
聊聊接口性能优化的11个小技巧
前言接口性能优化对于从事后端开发的同学来说,肯定再熟悉不过了,因为它是一个跟开发语言无关的公共问题。该问题说简单也简单,说复杂也复杂。有时候,只需加个索引就能解决问题。有时候,需要做代码重构。有时候,需要增加缓存。有时候,需要引入一些中间件,比如mq。有时候,需要需要分库分表。有时候,需要拆分服务。等等。。。导致接口性能问题的原因千奇百怪,不同的项目不同的接口,原因可能也不一样。本文我总结了一些行之有效的,优化接口性能的办法,给有需要的朋友一个参考。1.索引转载 2022-03-10 20:21:51 · 490 阅读 · 1 评论 -
Java性能调优的11个实用技巧
大多数开发人员认为性能优化是个比较复杂的问题,需要大量的经验和知识。是的,这并不没有错。诚然,优化应用程序以获得最好的性能并不是一件容易的事情,但这并不意味着你在没有获得这些经验和知识之前就不能做任何事。下面有几个很容易遵循的建议和最佳实践能够帮你创建一个性能良好的应用程序。这些建议中的大多数都是基于Java的,但是也不一定,也有一些是可以应用于所有的应用程序和编程语言的。在我们分享基于Java的性能调优技巧之前,让我们先讨论一下这些通用的性能调优技巧。1. 在必要之前,先不要优化这可能是最最重转载 2022-03-10 20:02:31 · 1778 阅读 · 0 评论 -
记一次接口性能优化实践总结:优化接口性能的八个建议
前言最近对外接口偶现504超时问题,原因是代码执行时间过长,超过nginx配置的15秒,然后真枪实弹搞了一次接口性能优化。在这里结合优化过程,总结了接口优化的八个要点,希望对大家有帮助呀~数据量比较大,批量操作数据入库 耗时操作考虑异步处理 恰当使用缓存 优化程序逻辑、代码 SQL优化 压缩传输内容 考虑使用文件/MQ等其他方式暂存,异步再落地DB 跟产品讨论需求最恰当,最舒服的实现方式嘻嘻,先看一下我们对外转账接口的大概流程吧1.数据量比较大,批量操作数据入库优化前转载 2023-04-20 22:45:56 · 156 阅读 · 0 评论 -
聊聊接口性能优化的11个小技巧
聊聊接口性能优化的11个小技巧 - 云+社区 - 腾讯云转载 2022-03-08 21:03:49 · 201 阅读 · 0 评论 -
阿里研究员谷朴:API 设计最佳实践的思考
简介:API是软件系统的核心,而软件系统的复杂度Complexity是大规模软件系统能否成功最重要的因素。但复杂度Complexity并非某一个单独的问题能完全败坏的,而是在系统设计尤其是API设计层面很多很多小的设计考量一点点叠加起来的(也即John Ousterhout老爷子说的Complexity is incremental【8】)。API是软件系统的核心,而软件系统的复杂度Complexity是大规模软件系统能否成功最重要的因素。但复杂度Complexity并非某一个单独的问题能完全败坏..转载 2022-03-08 20:49:10 · 768 阅读 · 0 评论 -
9种分布式ID生成方式,总有一款适合你
分布式ID必要性。业务量小于500W或数据容量小于2G的时候单独一个mysql即可提供服务,再大点的时候就进行读写分离也可以应付过来。但当主从同步也扛不住的是就需要分表分库了,但分库分表后需要有一个唯一ID来标识一条数据,数据库的自增ID显然不能满足需求;特别一点的如订单、优惠券也都需要有唯一ID做标识。此时一个能够生成全局唯一ID的系统是非常必要的。那么这个全局唯一ID就叫分布式ID。分布式ID需满足那些条件 全局唯一:基本要求就是必须保证ID是全局性唯一的。 高性能:高可用低延时转载 2021-06-05 21:42:47 · 462 阅读 · 0 评论 -
如何做到每天比别人少写200行代码?
熟练的掌握正则表达式,能够帮助程序员以最快的速度写出最优雅的代码。冰河在多年的编程工作中,对使用过的正则表达式进行了梳理和总结,这些正则表达式能够帮助你节省很多的编码时间,往往一个简单的正则表达式就能够省略大量的if...else...代码。这次,冰河向小伙伴们公开了自己平时经常使用的正则表达式,希望能够为小伙伴们带来实质性的帮助。冰河常用正则整数或者小数^[0-9]+\.{0,1}[0-9]{0,2}$只能输入数字^[0-9]*$只能输入n位的数字^\d{n}$.转载 2021-06-05 21:18:17 · 570 阅读 · 0 评论 -
SpringBoot之CommandLineRunner接口和ApplicationRunner接口
前言Spring boot的CommandLineRunner接口主要用于实现在应用初始化后,去执行一段代码块逻辑,这段初始化代码在整个应用生命周期内只会执行一次。转载 2021-06-04 21:57:18 · 759 阅读 · 0 评论 -
SpringBoot之CommandLineRunner
应用场景:溪源基于目前业务需求需要提前将部分数据加载到Spring容器中。大家可以想一下解决方案,下面评论去留言或者私信溪源。溪源能够想到的解决方案:定义静态常量,随着类的生命周期加载而提前加载(这种方式可能对于工作经验较少的伙伴,选择是最多的);实现CommandLineRunner接口;容器启动之后,加载实现类的逻辑资源,已达到完成资源初始化的任务;@PostConstruct;在具体Bean的实例化过程中执行,@PostConstruct注解的方法,会在构造方法之后执行;加载顺序为:Cons转载 2021-06-03 22:38:20 · 373 阅读 · 0 评论 -
Java 6种延时队列的实现方法
五一期间原计划是写两篇文章,看一本技术类书籍,结果这五天由于自律性过于差,禁不住各种诱惑,我连电脑都没打开过,计划完美宣告失败。所以在这能看出和大佬之间的差距,人家没白没夜的更文,比你优秀的人比你更努力,难以望其项背,真是让我自愧不如。知耻而后勇,这不逼着自己又学起来了,个人比较喜欢一些实践类的东西,既学习到知识又能让技术落地,能搞出个demo最好,本来不知道该分享什么主题,好在最近项目紧急招人中,而我有幸做了回面试官,就给大家整理分享一道面试题:“如何实现延时队列?”。...转载 2021-06-03 18:17:27 · 1441 阅读 · 0 评论 -
try-catch-finally中的4个大坑,老程序员也搞不定
在 Java 语言中 try-catch-finally 看似简单,一副人畜无害的样子,但想要真正的“掌控”它,却并不是一件容易的事。别的不说,咱就拿 fianlly 来说吧,别看它的功能单一,但使用起来却“暗藏杀机”,若您不信,咱来看下面的这几个例子...坑1:finally中使用return若在 finally 中使用 return,那么即使 try-catch 中有 return 操作,也不会立马返回结果,而是再执行完 finally 中的语句再返回。此时问题就产生了:如果 finally 中转载 2021-06-02 17:23:00 · 557 阅读 · 0 评论 -
如何有效减少Java内存占用过高
1、是否有内存泄漏2、业务层面,业务逻辑处理是否使用了大对象,比如上百字段的对象,这种冗余就会过多的占用内存3、能用局部变量,就不用成员变量和静态变量4原创 2021-06-02 15:19:51 · 1880 阅读 · 0 评论 -
警惕软件复杂度困局
简介:对于大型的软件系统如互联网分布式应用或企业级软件,为何我们常常会陷入复杂度陷阱?如何识别复杂度增长的因素?在代码开发以及演进的过程中需要遵循哪些原则?本文将分享阿里研究员谷朴关于软件复杂度的思考:什么是复杂度、复杂度是如何产生的以及解决的思路。较长,同学们可收藏后再看。写在前面软件设计和实现的本质是工程师相互通过“写作”来交流一些包含丰富细节的抽象概念并且不断迭代过程。另外,如果你的代码生存期一般不超过6个月,本文用处不大。一 软件架构的核心挑战是快速增长的复杂性越是...转载 2021-05-19 18:17:58 · 633 阅读 · 0 评论 -
如何写好代码?
简介:为了赶进度功能实现怎么快怎么来,只好欠下一堆技术债?业务逻辑复杂,如何处理比较好?相似的功能逻辑要不要copy修改一下复用?代码真的不需要写注释吗?好的代码不管对于个人还是团队来说,都是非常关键重要的,然而要写好代码却是一件非常不容易的事情,需要长期的经验积累和学习。本文作者分享了6个关于写好代码的入门的比较重要的点,希望对同学们有所帮助。写了多年的代码,始终觉得如何写出干净优雅的代码并不是一件容易的事情。按10000小时刻意训练的定理,假设每天8小时,一个月20天,一年12个月,大概...转载 2021-05-19 16:41:25 · 374 阅读 · 0 评论 -
如何写出健壮的代码?
简介:关于代码的健壮性,其重要性不言而喻。那么如何才能写出健壮的代码?阿里文娱技术专家长统将从防御式编程、如何正确使用异常和 DRY 原则等三个方面,并结合代码实例,分享自己的看法心得,希望对同学们有所启发。你不可能写出完美的软件。因为它不曾出现,也不会出现。每一个司机都认为自己是最好的司机,我们在鄙视那些闯红灯、乱停车、胡乱变道不遵守规则的司机同时,更应该在行驶的过程中防卫性的驾驶,小心那些突然冲出来的车辆,在他们给我们造成麻烦的时候避开他。这跟编程有极高的相似性,我们在程序的世界里要不断的..转载 2021-05-19 16:24:18 · 629 阅读 · 0 评论 -
错误码如何设计才合理?
简介:对于错误码的设计,不同的开发团队有不同的风格习惯。本文分享阿里文娱技术专家长统对于错误码的看法,希望从错误码使用的不同场景讨论得到一个合理的错误码规约,得到一个面向日志错误码标准和一个面向外部传递的错误码标准。一 前言在工作中,接触过不少外部接口,其中包括:支付宝,微信支付,微博开发平台,阿里云等等。每家公司错误码风格都不尽相同,有使用纯数字的,有使用纯英文的,也有使用字母和数字组合的。也接触过很多内部系统,错误码设计也不尽相同。错误码的输出路径面向日志输出服务内传递,最终是..转载 2021-05-19 15:01:56 · 963 阅读 · 0 评论 -
接口优化从13秒到3秒,我做了什么
口水记由于以前的一些债务,某些接口是越来越慢,越来越慢。最近做了一个新需求,其中有个接口的时间需要13秒。其实最开始是需要20多秒,后面优化了一下,就到13秒了。但是13秒,这能忍嘛。尽管这个接口只有在用户第一次使用才会请求到(涉及到三个系统),但也忍不了啊,直接劝退一波不忠实用户。只能是想办法,而且必须想办法。首先想到的是把一些循环查询去掉。说干就干,先去看看三个系统的链路,究竟是哪个系统耗时比较久。结果,其中最底层的系统花费了11秒,那结果稳了呀,把那个11秒优化了,不就ok转载 2021-05-19 14:24:39 · 900 阅读 · 0 评论 -
Java的对象工具类Objects
Java开发中经常要对对象进行非空判断以防止出现空指针。大部分同学都喜欢用下面这种方式来进行判断:if (obj!=null){ // 判断不等于空}if (obj==null){ // 判断等于空}这种方式没有什么问题。不过在 Java 7 中专门提供了一个工具类java.util.Objects可以处理的更好。java.util.Objects提供了一系列的静态方法来处理日常一些针对对象的操作。空值判断比如开始提到的null值判断我们可以优化为:if (转载 2021-05-18 16:55:17 · 695 阅读 · 0 评论 -
深入理解 Java 的接口和抽象类
对于面向对象编程来说,抽象是它的一大特征之一。在 Java 中,可以通过两种形式来体现 OOP 的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然。今天我们就一起来学习一下Java中的接口和抽象类。一、抽象类在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:abstract void fun();抽象方法必须用 abstract 关键字进行修饰。如转载 2021-05-18 11:30:06 · 233 阅读 · 0 评论 -
程序员缺乏经验的 7 种表现!
一、预览1. 一次性提交大量代码你能做什么: 进行小的代码提交。一个好的做法是:每个工作日都进行代码提交。 不要提交没有编译或者会导致构建失败的代码。 2. 代码写的很烂你能做什么: 编写代码之前,对你要实现的功能有个清晰的了解。为了清楚地理解需求,你需要尽量多问问题。 让你的代码简洁而优雅。其他团队成员可以读懂代码并理解它打算做什么。最新 Java 核心技术教程,都在这里了。 3. 同时开展多项工作你能做什么: 专注完成小的任务。将收到的任务分转载 2021-05-15 23:46:29 · 395 阅读 · 0 评论 -
常见代码重构技巧,非常实用
关于重构为什么要重构项目在不断演进过程中,代码不停地在堆砌。如果没有人为代码的质量负责,代码总是会往越来越混乱的方向演进。当混乱到一定程度之后,量变引起质变,项目的维护成本已经高过重新开发一套新代码的成本,想要再去重构,已经没有人能做到了。造成这样的原因往往有以下几点:编码之前缺乏有效的设计 成本上的考虑,在原功能堆砌式编程 缺乏有效代码质量监督机制对于此类问题,业界已有有很好的解决思路:通过持续不断的重构将代码中的“坏味道”清除掉。什么是重构重构一书的作者Martin..转载 2021-05-13 10:01:52 · 879 阅读 · 0 评论 -
Java中List集合对象去重及按属性去重的8种方法
一、本文梗概这一篇文章我想写一下List集合元素去重的8种方法,实际上通过灵活的运用、排列组合不一定是8种,可能有18种方法。对象元素整体去重的4种方法 按照对象属性去重的4种方法为了在下文中进行测试内容讲解,我们先做一些初始化数据public class ListRmDuplicate { private List<String> list; private List<Player> playerList; @BeforeEach转载 2021-05-07 15:24:16 · 5037 阅读 · 0 评论 -
java8 list中根据对象多属性去重
项目需求描述出于项目需要,有一个list,实体包含多个字段,当其中两个字段相同均相同时,就认为list中的两条记录是一样的,本来想通过分组实现,java8的分组只提供根据一个字段分组,只好另寻他路,java8有一个collectingAndThen可以根据多个字段去重,因为我们的需求是可以去重之后操作,因此采用这种方式。分组及去重分组classEntities.stream().collect(Collectors.groupingBy(ClassEntity::getGrade));转载 2021-05-07 14:52:19 · 3952 阅读 · 0 评论 -
JAVA中List集合按照对象的某一个或多个字段去重实现
如题继续总结工作中遇到的各种需求实现:import org.apache.commons.lang3.StringUtils;import java.util.*;/** * @Auther: * @Date: 2019/1/11 09:11 * @Description: 根据list中对象指定的n个字段去重测试 */public class TestMyUser { @org.junit.Test public void test(){ List转载 2021-05-07 19:11:04 · 1262 阅读 · 0 评论 -
Java汉字转拼音工具类(支持首字母和全拼)
工具类产生是因为个人业务需求需要根据中文汉字排序,而博主又对网上回答不满意,所以才根据相关资料写了该工具类,写入博客 以备不时之需。直接上代码:Java汉字转成汉语拼音工具类,需要用到pinyin4j.jar包,博主使用的是Maven项目,在pom.xml中引入依赖<dependency> <groupId>com.belerweb</groupId> <artifactId>pinyin4j</artifactId> <转载 2021-04-21 10:01:34 · 689 阅读 · 1 评论 -
Java判断字符串是中文还是英文
强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan前言最近项目的短信服务对接外国的第三方发短信通道,第三方对短信内容有限制,不能含中文字符(如果含调用结果肯定失败),所以在发送之前需要对短信内容做校验,看是否含有中文,如果含有则直接将短信发送状态改为失败,不用再去调用第三方;探索之旅站在巨人的肩膀上, 立马在网上搜索一下关于Java怎么判断字符串中是否含有中文;果然网上有很多实现;一、最简单的方式字符与字节的长度依据:一个中..转载 2021-04-21 09:52:50 · 9957 阅读 · 1 评论 -
Google工具库guava中集合类型Table
Table:它具有两个key[行, 列],对应一个值Table是Guava提供的一个接口Interface Table<R,C,V>Table可以看成:Table<R,C,V> == Map<R,Map<C,V>>它的主要方法:S.N. 方法 & 描述 1 Set<Table.Cell<R,C,V>> cellSet() 返回集合中的所有行键/列键/值三元组。 2 void cl.原创 2021-04-07 11:18:35 · 1148 阅读 · 0 评论 -
java 8 把list中对象的属性转成list
AcAppRole实体对象@ApiModelProperty(value = "主键ID")@TableId(value = "id", type = IdType.AUTO)private Long id;/** 角色描述 */@ApiModelProperty(value = "角色描述")private String remark;/** 角色名称 */@ApiModelProperty(value = "角色名称")private String name;/** 角色所转载 2021-03-30 13:45:06 · 5271 阅读 · 0 评论 -
springboot中如何使用事务
事务是我们在项目开发中必不可少的元素,大部分的业务操作都是多步操作完成的,而这多步操作必须要同时完成或同时失败,否则业务便失去了完整性,一定会出问题。比如做保存用户的操作:(1)保存用户到数据库(2)记录用户操作日志。如果第(1)和第(2)步之间出了问题,如果没有事务的话,可能导致用户记录到了数据库,但日志里面却没有记录,造成业务不完整。如果加入了事务,那么就可以避免这种问题。下面我们用代码来验证:1、首先是不加事务的代码其中先保存user到数据库,然后打印1/0,这步会报错,然转载 2021-02-28 21:48:22 · 5981 阅读 · 0 评论 -
处理 Exception 的几种实践,很优雅,被很多团队采纳!
在Java中处理异常并不是一个简单的事情。不仅仅初学者很难理解,即使一些有经验的开发者也需要花费很多时间来思考如何处理异常,包括需要处理哪些异常,怎样处理等等。这也是绝大多数开发团队都会制定一些规则来规范对异常的处理的原因。而团队之间的这些规范往往是截然不同的。本文给出几个被很多团队使用的异常处理最佳实践。在Finally块中清理资源或者使用try-with-resource语句当使用类似InputStream这种需要使用后关闭的资源时,一个常见的错误就是在try块的最后关闭资源。pu转载 2021-01-29 21:19:05 · 301 阅读 · 0 评论 -
Hutool-poi是针对Apache POI的封装,操作Excel【三】
package com.example.demo.hutool;import cn.hutool.core.collection.CollUtil;import cn.hutool.core.date.DateUtil;import cn.hutool.poi.excel.ExcelUtil;import cn.hutool.poi.excel.ExcelWriter;import cn.hutool.poi.excel.StyleSet;import lombok.Data;import.原创 2020-11-16 00:04:05 · 4020 阅读 · 0 评论 -
Hutool-poi是针对Apache POI的封装,操作Excel【二】
package com.example.demo.hutool;import cn.hutool.poi.excel.ExcelReader;import cn.hutool.poi.excel.ExcelUtil;import lombok.Data;import org.junit.Test;import java.util.List;import java.util.Map;/** * @Description Hutool-poi是针对Apache POI的封装 * * .原创 2020-11-16 00:01:27 · 1820 阅读 · 0 评论