Server端在单台服务器上的优化,并没有多少技巧可言。
当然,这是在你充分了解如何写出优秀代码的前提下,如果你对这方面没有自信,建议先看看《XX性能优化》这类的书!
1. Server端的优化,排在第一位的一定是【缓存】
根据二八定律,数据库修改数据和查询数据的比例是2:8,在门户网站,这样的比率还要更低!
如果数据没有变化,理论上基于数据的无数次计算,结果一定是幂等的。
那么,是不是可以避免多次的重复运算? 答案就是缓存。
缓存的重要性用多少话语来描述都不过分。淘宝,京东这些可以处理上亿并发的平台,很大一部分都是依赖于后台强大的分布式缓存架构。
在处理缓存时,最要注意的是缓存的命中率。如果缓存的命中率过低,反而会拖累系统的性能,反过来讲,缓存的命中率过高,又会导致脏数据的产生。关于这部分我就不深入讲,感兴趣的话,可以个人研究。
关于缓存方面的框架,最NB的只能是Memcache。Memcache是一款key/value的NoSql数据库,为了提升性能,所有数据都放在内存中。由于Memcache和PHP集成的很好,国内淘宝,微博等这些使用PHP开发的平台都是基于Memcache搭建缓存框架的。
而Memcache由于需要单独部署,在一些小型系统中使用起来成本太高,很多其他的替代方案也是不错的选择。
比如在Java中,Ehcache的使用率要远远高于Memcache。
Ehcache不用独立安装,并且可以很好的和Spring,Hibernate这样的框架进行一键整合,并且也支持分布式部署。
相关的性能测试,Ehcache的跑分也并不比Memcache逊色。
Ehcache缺点是基于Web容器,部署分布式相当麻烦,同时也只支持Java平台。在数据持久化方面,需要写入硬盘,这是相当耗费性能的。这在类比淘宝的大平台中,部署分布式缓存还一定要部署一个Tomcat,听说淘宝有8000个服务器,也就是XXXX个tomcat,好TMD的壮观。
不过从另一方面来讲,在一些Java管理系统中,根本不需要分布式,而且买系统天然送JBoss,不用单独部署,这绝对是优点!
2. 数据库访问
目前很多成熟的ORM框架代理了系统中的数据库访问,大大方便了开发人员。但是正是由于ORM的高度封装性,在查询时会大大拖慢系统的性能。
ORM的大厂商Hibernate,也深知自己的弱点所在,在后期的版本中增加了Criteria,期望以Criteria来替代臃肿的查询,可是在易用性上一直为人所诟病,所以迟迟不能推广。
建议使用其他的查询框架替代Hibernate HQL和Criteria,并结合Ehcache来使用。
Java中比较出名QueryDSL,JOOQ都是不错的选择,使用它们,也会大大提高系统查询方面的灵活性。
3. 学会使用并发
并发在开发中,绝对属于高级的东西。相信很多开发人员都没有接触过。
Java6中提供了ExecutorService,Java7升级为Fork/join,Java8更是在Fork/join的基础上实现了并行Stream的概念。这证明在数据越来越庞大,硬件越NB的情况下,并发编程是大势所趋。
还有,普通的家用机现在都是4核CPU,8线程,不用并发,太浪费了吧?
给大家举一个我实际遇到的例子,来证明并发的好处。
我有一个客户,需要一次性导出不下于100张订单的PDF报告,平均每生成一个PDF的时间大约为4秒,在这种情况下,我无论如何也没脸面同客户解释,只导出100张订单,需要等待至少6分钟.....
之后我引入了并发来实现这个功能,测试时,100张订单,只需要6秒!!当我第一次看到这个效果,直接在办公室兴奋的嗷嗷叫!!!
在使用并发时,也可以使用相关的框架来简化开发。
Java 的Akka是非常不错的并发框架,在小型的项目中,也可以使用Guava提供的API,简单易用。
由于Server端都是强语言,成熟且易于控制,确实没有多少技巧可讲。
如上三点同样是粗放简单的,如果你有心,使用它们提升你的系统性能吧。
下一篇,将讲解数据库方面的优化,主要涉及索引,缓存,慢查询,分表,读写分离等,敬请期待。
如有您有兴趣,请关注我的微信公众号,谢谢。