首先要了解高并发的的瓶颈在哪里?
1、可能是服务器网络带宽不够
2.可能web线程连接数不够
3.可能数据库连接查询上不去。
根据不同的情况,解决思路也不同。
-
像第一种情况可以增加网络带宽,DNS域名解析分发多台服务器。
-
负载均衡,前置代理服务器nginx、apache等等
3. 数据库查询优化,读写分离,分表等等
最后复制一些在高并发下面需要常常需要处理的内容:
-
尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能。
-
用jprofiler等工具找出性能瓶颈,减少额外的开销。
-
优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句(仅耗时较长的查询做优化)。
-
优化数据库结构,多做索引,提高查询效率。
-
统计的功能尽量做缓存,或按每天一统计或定时统计相关报表,避免需要时进行统计的功能。
-
能使用静态页面的地方尽量使用,减少容器的解析(尽量将动态内容生成静态html来显示)。
-
解决以上问题后,使用服务器集群来解决单台的瓶颈问题。
思路:
1.动静态分离:前端静态页面使用cdn缓存,nginx里也能配置缓存和失效时间,后端使用redis,memcache等nosql
2.负载均衡:集群分流
多个请求操作同一条数据时,数据库设置的有行级锁。前一个请求获得锁之后,在执行完操作之后,下一个请求才能获得该条数据的锁。多个请求处于阻塞状态,这就是数据库的串行。
为了解决数据库的串行处理带来的阻塞状态,可以考虑减少事务锁时间,由程序调用数据库的增删改操作完成之后再返回给程序
影响的结果条数来判断是回滚还是提交事务改成由数据库自己执行完增删改操作之后自己决定是提交还是回滚事务。也就是减少
事务锁的时间。