高并发的优化

从大往小说:
服务器结构层面
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:只写出了宏观上的做法,每一点应该怎么做、为什么这么做都有很多内容,太多就不细说了。。。原文地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值