Java高并发处理方案
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
java高并发如何解决什么方式解决
一什么是高并发
二高并发解决思路
三高并发解决方案?
一、什么是高并发
1.1 高并发High Concurrency是互联网分布式系统架构设计中必须考虑的因素之一它通常是指通过设计保证系统能够同时并行处理很多请求。
1.2 高并发相关常用的一些指标有响应时间Response Time吞吐量Throughput每秒查询率QPSQuery Per Second并发用户数等。
1.2.1 响应时间系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms这个200ms就是系统的响应时间。
1.2.2 吞吐量单位时间内处理的请求数量。
1.2.3 QPS每秒响应请求数。在互联网领域这个指标和吞吐量区分的没有这么明显。
1.2.4 并发用户数同时承载正常使用系统功能的用户数量。例如一个即时通讯系统同时在线量一定程度上代表了系统的并发用户数。
二高并发解决思路
1服务器网络带宽不够增加网络带宽
2web线程连接数不够DNS域名解析分发多台服务器负载均衡前置代理服务器nginx、apache等等
3数据库连接查询瓶颈数据库查询优化读写分离分表等等
4尽量使用缓存包括用户缓存信息缓存等多花点内存来做缓存可以大量减少与数据库的交互提高性能用jprofiler等工具找出性能瓶颈减少额外的开销。
5优化数据库查询语句减少直接使用hibernate等工具的直接生成语句仅耗时较长的查询做优化。
6优化数据库结构多做索引提高查询效率。
7统计的功能尽量做缓存或按每天一统计或定时统计相关报表避免需要时进行统计的功能。
能使用静态页面的地方尽量使用减少容器的解析尽量将动态内容生成静态html来显示。
8不要频繁的new对象,对于在整个应用中只需要存在一个实例的类推荐使用单例模式对于String的连接操作,使用StringBuffer或者StringBuilder对于utility类型的类通过静态方法来访问。
9避免使用错误/异常的方式如Exception可以控制方法推出但是Exception要保留stacktrace消耗性能除非必要不要使用 instanceof做条件判断,尽量使用比的条件判断方式使用JAVA中效率高的类比如ArrayList比Vector性能好。
10出现超时的情况一般说明并发数量已经超过了数据库所能处理的极限数据库无限等待导致超时此时建议采用线程池的方案支付宝的单号就是用的线程池的方案进行的。数据库 update 不是一次加1而是一次加几百甚至上千然后取到的这 1000个序号放在线程池里慢慢分配即可能应付任意大的并发同时保证数据库没任何压力。
三、高并发的解决方法有
1.并发锁
首先我们要知道高并发下会出现某一个时刻流量猛增还有就是如果是抢购之类的库存类并发可能会导致超卖库存为负数之类的对于并发锁来说主要是解决抢购超卖问题的并不能很好的解决流量猛增给服务器带来的压力有时候甚至会加重服务器的压力所以我们并发量小及服务器配置比较高的时候可以用并发锁来处理下面就介绍几种常用的并发锁
1.synchronize同步排它锁
这个对于java开发来说肯定不陌生它可以让各个线程同步执行缺点是极度的耗费性能临时处理可以使用经常使用的情况下不推荐
2.数据库锁
mysql数据库也是自带锁的这种情况一般用行锁不过这个会产生事务阻塞数据库极度耗费性能且容易造成死锁一般在内部确定的极低的并发一般就2个并发的时候使用
2使用redis 缓存
1什么是redis?
Redis是一个开源DBS许可的内存中的数据结构存储系统他可以用作数据库缓存和消息中间件他支持多种类型的数据结构如字符串String散列表hashes列表lists集合sets有序集合sorted sets与范围查询 bitmaps hyperloglogs 和 地理空间geospatial 索引半径查询。
2redis 特点
Redis 内置了 复制replicationLUA脚本Lua scripting LRU驱动事件LRU eviction事务transactions 和不同级别的 磁盘持久化persistence 并通过 Redis哨兵Sentinel和自动 分区Cluster提供高可用性high availability).
速度快: tomcat: 150-220/秒 nginx: 3-5万/秒 redis: 写 8.6万/秒 读 11.2万/秒 ~ 平均10万次秒