java优化高并发、高负载

大型网站在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。

代码优化

从最基础的地方做起,优化我们写的代码,减少必要的资源浪费。
a、避免频繁的使用new对象,对于整个应用只需要存在一个实例的类,我们可以使用单例模式。对于String连接操作,使用 StringBuffer或StringBuilder,对于工具类可以通过静态方法来访问。
b、避免使用错误的方式,尽量不用instanceof做条件判断。使用java中效率高的类,比如ArrayList比Vector性能好。

数据库集群

当面对复杂的应用,用户大量访问的时候,一台数据很快无法满足需求,于是我们需要使用数据库集群或者库表散列。
常用的优化措施是M-S(主-从)方式进行同步复制,将查询和操作和分别在不同的服务器上进行操作。
a、在数据库设计的时候就要考虑到后期的维护,数据库三范式是我们设计数据库索要遵循的原则。
b、索引的建立:建立索引要适当,如果一个表经常用来被查询,对于增加和修改很少被用到,我们就可以为这个表建立索引,因为对于增加和修改和删除操作时,我们对索引的维护要大大超过索引给我们带来的效率。
c、表字段的类型选择要恰当,包括字段的长度、类型等,要根据实际存储的数据进行选择,长度不要过长,否则会影响效率。
d、外键要慎用,因为主键代表这一张表,而外键代表一群表,对表之间进行了关联,在删除修改等需要我们关联。
e、在数据库操作上
尽量使用prepareStatement,少用Statement,因为PrepareStatement是进行预编译的。
connection设置为readOnly,Connection是对数据库连接,属于重量级,我们使用即可。
连接池的使用,我们可以修改数据库默认的连接数。
f、优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句(仅耗时较长的查询做优化)。
g、统计的功能尽量做缓存,或按每天一统计或定时统计相关报表,避免需要时进行统计的功能。

HTML静态化

我们把最初对test.do的请求结果保存成一个html文件,然后每次用户都去访问这个html文件,这样就不用再去访问服务器了,服务器的压力不就减少了?
那如何自动的生成静态页面,当用户去访问,会自动的生成test.html ,然后再显示给用户。
能使用静态页面的地方尽量使用,减少容器的解析(尽量将动态内容生成静态html来显示)。
1)效率最高、消耗最小的是纯静态HTML页面
2)缓存
3)信息发布系统CMS–可信息录入自动生成静态页面

图片服务器分离

对于web服务器来说,图片是最消耗资源的,于是我们有必要把图片与页面进行分离,我们把图片放到独立的图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力,并且可以保证系统不会因为图片的问题而崩溃。在图片服务器上,我们可以对不同的配置进行优化。

缓存、负载均衡、存储

缓存:尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能。
可以考虑memcached缓存集群和静态HTML、redis缓存
负载均衡:nginx(异步)、squid(同步)、lighttpd(异步)
存储:分布式的,如hadop等

 附:memcached和redis整体对比:
 Redis的作者Salvatore Sanfilippo曾经对这两种基于内存的数据存储系统进行过比较,总体来看还是比较客观的,现总结如下:
 1)性能对比:由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。
 2)内存使用效率对比:使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。
 3)Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择。

你可能感兴趣的:(java)