高并发的优化

从大往小说:

一、服务器结构层面

1、首先是应用服务器和数据服务器分离

2、应用服务器可以作为集群由一台或多台nginx服务器使用负载均衡共同管理,这其中涉及到应用服务器集群共享session等同步问题。 多台nginx也可以由其他安装了负载均衡软件的机器管理。 也就是三层结构:安装了负载均衡软件的机器(主要有两种常用的软件,lvs和keepalived)——多台nginx——应用服务器集群。 这里说的都是软件实现的负载均衡,现在硬件 的负载匀衡效果是最好的但是太贵了,可以百度一下负载均衡的硬件最少10w+(最便宜的能用吗?)。

3、数据库服务器组成集群进行读写分离,主从同步。 对mysql来说,可以让多个master分别作为对方的slave,避免单台master出现问题整个集群都坏了。 master使用 innodb引擎进行事务和除查询之外的操作(由innodb的特性决定),slave使用myisam引擎进行查询操作。整个mysql集群同样可以被负载均衡(lvs加keepalived)。

nginx+tomcat+mysql挺好的,适合自己拿来玩。 Apache(阻塞)可以取代nginx(异步非阻塞),但是并发数3w后效果比nginx差很多,其实lamp(linux+apache+mysql+php)这种主流结构的思路也是免费+并发+灵活。

二、应用中的细节方面:

数据库配置和sql语句优化

1、对于innodb引擎来说,每次alter操作都相当于整表重建,把引起结构变更的sql语句调整为一句话,能够减少数据库的执行时间。

2、order by的处理,delete insert的合并

3、注意数据库的缓存,减少io。配置mysql的一些参数起到优化作用

3、使用preparedstatement对象,可以预编译sql语句节省时间,还可以避免sql注入

4、经常使用的一组命令设置为存储过程,省去了每条sql语句的编译过程

5、如果数据是通过多表关联获取,那么使用join,为了提高join性能,最好在join列创建索引,并且join条件的这些列最好使用相同的

数据类型和定义

6、评估数据的读写行为是否适用新的压缩特性,如果可以建议执行create table时指定row_format=compressed选项提高读写性能。

7、myisam引擎可以把表设为静态格式表,空间换时间,使用dynamic格式保存大数据类型(blob、text)更有效率

8、对数据库的操作会在mysql库(库名叫mysql)中的各个priv表中查找权限,顺序是user、db、table、column。因此权限粒度越大反而会起到优化作用。

三、程序优化

1、使用线程池和数据库连接池,使用缓存

2、同步代码为了线程吞吐量可以使用stampedlock(jdk8新出的lock实现类),jdk6及以后的synchronized关键字和reentrantlock类的效率已经差不多了,jdk5还是使用reentrantlock性能更好

3、对于同步的数据可以使用分段加锁,concurrenthashmap就是这么干的

4、避免在循环中加锁(阻塞和唤醒很费时间),不如直接把整个循环加锁(如果不影响多线程间的逻辑关系)

5、减少锁持有的时间,多个线程尽量以相同的顺序去获取资源

6、同步集合类尽量使用jdk自带的concurrent包下的同步集合类,性能比普通的线程安全集合类好很多

7、使用nio,避免阻塞(如果应用需要使用大量io操作)

PS:只写出了宏观上的做法,每一点应该怎么做、为什么这么做都有很多内容,太多就不细说了。。。

转载于:https://my.oschina.net/shaochuan/blog/956217

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值