大型服务端开发的反模式

2016-08-03
阅读 3 分钟
5.8k
1. 用线程池执行异步任务 为了减少阻塞时间,加快响应速度,把无需返回结果的操作变成异步任务,用线程池来执行,这是提高性能的一种手段。 你可能要惊讶了,这么做不对吗? 首先,我们把异步任务分为两种: 务必成功执行的 不成功就放弃 显然大多数时候都是第一种。那么当你把任务丢给线程池,你知道它完成了没有吗? ...

缓存架构的理论分析

2016-07-10
阅读 2 分钟
8.2k
虽然经验显示RDBMS最快时只需0~1ms就能响应,不逊于专门的缓存,但是当压力增大时,性能的下降也是飞快的。随着业务的逐渐复杂、开发团队的逐渐扩大,难以全面优化所有的SQL,数据库内存的命中率难免下降。

通过推理找到眼镜

2016-01-11
阅读 1 分钟
2k
这么找不是办法,于是我定下来进行推理。简单分析注意到,眼镜的失踪,分为今早用了眼镜和今早没用眼镜两种情况。如果今早用了,应该就放在我上午的活动范围内;如果今早没用,那就应该在昨晚放的位置。这好像是一句废话,然而只要分别从这两个方向出发,就能得到深入的结论。

略谈服务端缓存设计

2015-10-14
阅读 1 分钟
5.7k
根据我们每日千万次访问的经验来看,缓存不是必须的。优化充足的情况下,SQL平均耗时1ms。这是因为命中了索引,并且命中了MySQL缓冲池(内存中)。如果命中索引但不命中缓冲池,且查询数据量不大,磁盘并发量不高,则大约耗时10ms(磁盘寻道)。如果这些都不满足,耗时就大了。

慎用ThreadLocal

2015-09-18
阅读 1 分钟
7.8k
ThreadLocal是个很爽的东西,线程安全,能当全局变量来用(别!)。 上一篇末尾提到ThreadLocal的妙用,这东西确实在框架实现中很常用。不过一定要小心啊。 先告诉大家一个安全秘诀:try-finally大法,百战百胜!(一定要在finally里清空ThreadLocal) 我职业生涯遇到最棘手的并发bug都是ThreadLocal造成的,称之为ThreadL...

异常高效使用小窍门 -- 读Scala源码有感

2015-09-18
阅读 1 分钟
3.8k
抛的异常类是NonLocalReturnControl,继承自Throwable,有个字段用来放置要返回的值。编译器把return value大致翻译成throw new NonLocalReturnControl(key/*metadata*/, value)就可以了。

勿对不可变对象做同步/加锁

2015-05-17
阅读 2 分钟
5.9k
不可变对象(Immutable Object),就是状态始终不会改变的对象,例如值对象(Value Object),无状态的服务对象(Stateless Service Object)。

Java代码分析器(六): 大规模自动重构经验谈

2015-05-14
阅读 1 分钟
7.6k
最后再啰嗦一篇吧,分享些宏观经验,供需要做类似事情的人参考。 技术示例在前篇! 伸手党绕行! 大规模系统重构,不可避免要触到各个团队/模块的很多代码,很可能破坏功能,到时候你就成众矢之的了,tickets扑面而来,到处灭火。 怎么确保不破坏功能呢?就要做安全重构。(2016/4/16做了补充,以方括号[]标出) 充分了解系...

MacBook Pro使用体验

2015-05-05
阅读 1 分钟
8.3k
屏幕超好!16: 10比16: 9更接近黄金比值0.618,也更适合看代码(一屏的行数更多)。Retina屏精细的画质(歌颂三遍),Mac美观的字体,充满设计感的UI,都让人很舒心。(Yosemite UI没有想象中那么扁)

Java代码分析器(五): 语义分析简介

2015-04-24
阅读 3 分钟
8.4k
本系列临近尾声,科技树到此点满。 语法分析主要用库解决了,代码变成了一棵树,但是变量类型,方法签名之类的东东都不清楚。 如果做IDE插件,可以享受IDE的语义分析能力。为了让程序独立运行,我自己按需实现了语义分析。 比较复杂,就分享一种最典型的吧。贴代码为主,有问题请告诉我,我再改文章。 解析某个变量的声...

Java代码分析器(四): 代码改写技术

2015-04-24
阅读 3 分钟
4.6k
下面介绍经过验证的具体技术,能局部修改代码,调API就行了(感谢Eclipse)。文档里很难查到这些,痛的回忆…… (有句名言说: 画一条线值1美元,知道在哪画线值9999美元。)

Scala 模式:管道操作符

2015-04-16
阅读 2 分钟
5.1k
我写出了获取数据的表达式Map("a"->1, "b"->2),想起来要返回json,于是移动到行首,写上Json(,再移动到行尾,写上)。

用Lambda武装你的Java: 灵活的事务

2015-04-12
阅读 2 分钟
6.8k
当你采用Spring之类的框架,用了声明式事务,难道每一段需要事务的代码都必须写成一个bean method,再标上@Transactional?

用Lambda武装你的Java: 集合转换

2015-02-12
阅读 2 分钟
4.6k
网上介绍Java 8 lambda和集合新特性的代码太千篇一律了,我来提供些不一样的。虽然很简单,但也是工业级代码,不是网上抄来抄去的教学代码。权当给大家提供一个思路。

Java代码分析器(三): 以强大的属性描述符写出通用代码

2015-02-05
阅读 2 分钟
5.6k
上篇介绍的形形色色的语法元素大概让人眼花缭乱了,而且每种元素都对应一个Java类。知道是一回事,使用就是另一回事了,这么多个类,要给每个类写对应的处理代码,不胜其烦。ASTVisitor虽然能自动遍历语法树,但是并不能帮你处理每一种结点。

对象设计要考虑有效范围

2014-09-13
阅读 3 分钟
3.8k
单例对象(Singleton)的有效范围几乎是整个应用的开启时间,Socket的有效范围通常是网络连接的持续时间,而一个临时的Integer则可能瞬间就被丢弃了。Let's 注意,不同范围的对象/类,不能随意地组合/继承在一起。

活用设计模式:如何避免一连串的if else

2014-09-10
阅读 2 分钟
17.3k
因为他用Python,我就回答:把每一个条件判断都写成一个布尔函数,把这些函数依次放进一个数组/列表。再写一个函数来遍历数组,对每一项,若为假则返回,若为真则继续。

Java代码分析器(二): 使用DOM API操作抽象语法树

2014-09-07
阅读 3 分钟
7.9k
读完本篇后请继续完成上篇的延伸阅读:[链接] 点击JDT Plug-in User Guide -> Programmer's Guide -> JDT Core -> Manipulating Java Code。

Java代码分析器(一): JDT入门

2014-07-17
阅读 2 分钟
24.2k
能。Eclipse这个开源的Java IDE就提供了一个库来帮助我们达到目的,它的名字是JDT(Java Development Tools)。我们使用它的核心模块JDT Core。