工作记录(20190715)

输入文章标题的时候才发现距离上次工作总结已经过去近半年,期间老婆怀孕,自己又从SF离职到阿里接触全新的业务,其间种种,一言难尽。感慨下人一忙就发胖,中间少不了老妈优秀厨艺的助攻,好在结果不错,这段时间自己也适应了新的生活和工作节奏,博客写起来,健身搞起来。感慨完毕,表一下最近我又收获了哪些坑。

1.NPE,最近拜读《重构》一书,收益匪浅,其间学习到了很多有用的重构手法,比如临时参数的处理和抽象层次的提取。某次重构过程中,将现有的逻辑抽象向上提取了一层,由于代码缺陷在某些业务场景下造成NPE,所以说纸上得来终觉浅,绝知此事要躬行。

2.关于fastJson版本升级踩坑,某些业务场景下需要对历史请求数据做对比,为了偷懒,原本的设计是将对象json序列化后利用String的equals方法,并不是核心业务,前期这么做无可厚非,但是将fastJson版本1.2.25变更为1.1.37(安全版本)后对比数据一直存在问题,检查日志发现,两个版本对浮点数精度的默认值不一样,另外字段的排序顺序也有不同。

3.同事踩坑SimpleDateFormat并发环境下线程安全问题,1.8及以上版本使用DateTimeFormat类,1.8以下版本使用ThreadLocal封装解决。

4.时间函数,最近业务中使用到了时区转换问题,Date的话需要使用时间Format来格式化,较为麻烦;直接利用时区写死加减法也是不可取的;JDK1.8及以上提供了LocalDateTime类解决相关问题。

5.关于慢SQL的治理,一般小系统的业务瓶颈都在慢SQL上,根据二八原则,定期整理慢SQL的Top10并解决,能有效提升系统效率。

6.关于SQL优化,个人经验也不是很丰富,几点建议:不要吝啬索引;限制索引长度;检查条件是否真的落在聚合索引上;如无必要,不要建立外键;字段适当冗余;不应当使用isNull来做条件判定。

7.深度分页,概念就不赘述了,简单来讲你使用mysql的分页limit 100000, 15其效率和limit 10, 15肯定是不可同日而语的。所以需要一定手段来避免深度分页,一般手法是将limit语句改造成条件语句where from<=x AND x<=to。这里你就可以看出单表下有一个id自增字段是多么重要了。多表关联处理方法类似,先查找范围,将范围转化为条件语句。这里注意,用范围条件语句一是增加了程序复杂度,二是如果你的范围字段不连续可能会造成分页不均匀。

8.还是关于数据库,朋友的疑惑在于拆分微服务后,数据库也跟着拆分,之前显示功能中的关联查询怎么办。我的疑问在于既然要拆分,说明系统关联性不大,为什么还要保留那个关联查询。解决方案:评估关联性后重新拆分领域;如果真的是基础数据,那么相关系统内建立从表冗余;另有朋友说数据库视图可以解决,这个我没有尝试过。

9.推荐下阿里代码扫描插件,IDEA的Plugins栏搜索alibaba出现的第一个插件就是,除了有点啰嗦,使用还是很不错的。

10.logback踩坑,logback日志框架据说效率要比log4j系列要高,并发性要好,真实性请看评测文。logback是有缺省配置的,也说是说你的配置路径不对不影响日志打印,只不过和你想要的效果肯定有区别。

11.记一次任务重构,背景原任务会将数据库数据取出计算放到Redis缓存供业务使用,原任务为单机单线程实现,目前的任务量执行一次需要20+小时,且其设计不具有拓展性。改造思路,将单机改造为多机,将单线程改造为多线程。主要涉及到的点有三个任务拆分、分发和执行。拆分可以参考上面的深度分页,主要是将整体任务分块,让多台机器执行不用并发问题且负载均衡;分发不赘述,可以借助消息中间件或者数据库的能力;执行,主要是子任务包装成多线程任务执行。重构完后的任务五台机器情况下执行任务需半小时。

12.关于机器负载,接上面重构任务第一次重构完五台机器十分钟可以跑完全量数据,子任务是在线程池中进行,由于使用系统自定义线程池,没有对线程数量做限制,导致cpu负载90以上,后对线程数量做了限制,保证任务可以平滑执行。这里可以深入学习下线程池的构造参数。

13.mybaitis的映射文件中属性jdbcType可以有效防止null值的问题。

14.关于网络传输对象VO的建立是否必要,仁者见仁,智者见智。这里举一个必要的例子,最近接受一接口联调,由于接口内容改变,所以改变了数据库实例DO类的结构,修改后直接上线。后来得知该系统后面还有多个系统数据交互遂心凉,查看代码后才心安,其中有convert逻辑,DO->VO->json序列化后->其他系统,幸亏有这层逻辑,否则下游系统将会统统报异常。当然这里只是举例DO到VO之间,类比内存对象的网络传输。

15.最近学习了下跳表,跳表目的是解决顺序链表只能顺序查找无法二分查找的问题,而且避免树形数据结构的复杂实现,于是空间换时间,增加维度关联跨越节点之间的联系,其设计充分利用了计算机的随机之美。跳表实现可以参考下JDK1.8的ConcurrentSkipListMap类,其关于维度抽象类的设计也是非常值得称赞得。

 

你可能感兴趣的:(Java,工作)