java高并发,如何解决,什么方式解决
一、什么是高并发
1.1 高并发(high concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。
1.2 高并发相关常用的一些指标有响应时间(response time),吞吐量(throughput),每秒查询率qps(query per second),并发用户数等。
1.2.1 响应时间:系统对请求做出响应的时间。例如系统处理一个http请求需要200ms,这个200ms就是系统的响应时间。
1.2.2 吞吐量:单位时间内处理的请求数量。
1.2.3 qps:每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。
1.2.4 并发用户数:同时承载正常使用系统功能的用户数量。例如一个即时通讯系统,同时在线量一定程度上代表了系统的并发用户数。
二、高并发的解决方法有两种
一种是使用redis缓存、另一种是使用nginx生成静态页面还有就是从最基础的地方优化我们写代码减少不必要的资源浪费:
-
使用redis缓存原因:
首先缓存技术是在用户请求时将数据保存在缓存中,下次请求时会检测缓存中是否有数据存在,防止多次请求服务器,导致服务器性能降低,严重导致服务器崩溃,这只是我自己的理解,详细的资料还是需要在网上收集; -
nginx生成页面静态化:
简单的说,我们如果访问一个链接 ,服务器对应的模块会处理这个请求,转到对应的jsp界面,最后生成我们想要看到的数据。这其中的缺点是显而易见的:因为每次请求服务器都会进行处理,如 果有太多的高并发请求,那么就会加重应用服务器的压力,弄不好就把服务器 搞down 掉了。那么如何去避免呢?如果我们把对 test.do 请求后的结果保存成一个 html 文件,然后每次用户都去访问 ,这样应用服务器的压力不就减少了?
那么静态页面从哪里来呢?总不能让我们每个页面都手动处理吧?这里就牵涉到我们要讲解的内容了,静态页面生成方案… 我们需要的是自动的生成静态页面,当用户访问 ,会自动生成 test.html ,然后显示给用户。
三、追加
多线程处理50w数据方案
1:批处理方式每3000条处理一批数据
2:所有数据查询丢到for循环外处理
3:使用 preparedstatement ps = con.preparestatement(sql);
通过addbatch()的方式,将数据缓存在对象里面,通过最后执行executebatch();方法提交,因此速度会快很多!
4:开始多线程thread处理不影响其它主线程运行
5:通过jdbc进行数据入库操作
6:插入redis等缓存中进行同步数据库