高并发与多线程的关系、区别、高并发的技术方案

什么是高并发?

高并发(High Concurrency)是一种系统运行过程当中遇到的一种“短期内遇到大量操做请求”的状况,主要发生在web系统集中大量访问收到大量请求(例如:12306的抢票状况;天猫双十一活动)。该状况的发生会致使系统在这段时间内执行大量操做,例如对资源的请求,数据库的操做等。java

高并发的处理指标?

高并发相关经常使用的一些指标有:mysql

1.响应时间(Response Time)laravel

响应时间:系统对请求作出响应的时间。例如系统处理一个HTTP请求须要200ms,这个200ms就是系统的响应时间web

2.吞吐量(Throughput)redis

吞吐量:单位时间内处理的请求数量。算法

3.每秒查询率QPS(Query Per Second)sql

QPS:每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。shell

4.并发用户数数据库

并发用户数:同时承载正常使用系统功能的用户数量。例如一个即时通信系统,同时在线量必定程度上表明了系统的并发用户数。编程

高并发和多线程的关系和区别

“高并发和多线程”老是被一块儿提起,给人感受二者好像相等,实则 高并发 ≠ 多线程

1.多线程

多线程是java的特性,由于如今cpu都是多核多线程的,能够同时执行几个任务,为了提升jvm的执行效率,java提供了这种多线程的机制,以加强数据处理效率。多线程对应的是cpu,高并发对应的是访问请求,能够用单线程处理全部访问请求,也能够用多线程同时处理访问请求。

在过去单CPU时代,单任务在一个时间点只能执行单一程序。以后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并非真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操做系统来完成多任务间对CPU的运行切换,以使得每一个任务都有机会得到必定的时间片运行。

再后来发展到多线程技术,使得在一个程序内部能拥有多个线程并行执行。一个线程的执行能够被认为是一个CPU在执行该程序。当一个程序运行在多线程下,就好像有多个CPU在同时执行该程序。

总之,多线程便可以这么理解:多线程是处理高并发的一种编程方法,即并发须要用多线程实现。

2.高并发

高并发不是JAVA的专有的东西,是语言无关的广义的,为提供更好互联网服务而提出的概念。

典型的场景,例如:12306抢火车票,天猫双十一秒杀活动等。该状况的发生会致使系统在这段时间内执行大量操做,例如对资源的请求,数据库的操做等。若是高并发处理很差,不只仅下降了用户的体验度(请求响应时间过长),同时可能致使系统宕机,严重的甚至致使OOM异常,系统中止工做等。

若是要想系统可以适应高并发状态,则须要从各个方面进行系统优化,包括,硬件、网络、系统架构、开发语言的选取、数据结构的运用、算法优化、数据库优化等……而多线程只是其中解决方法之一。

多线程并发技术

PHP多线程编程将会涉及到以下技术点:

1.并发编程三要素

  • 原子性原子,即一个不可再被分割的颗粒。在Java中原子性指的是一个或多个操做要么所有执行成功要么所有执行失败。
  • 有序性程序执行的顺序按照代码的前后顺序执行。(处理器可能会对指令进行重排序)
  • 可见性当多个线程访问同一个变量时,若是其中一个线程对其做了修改,其余线程能当即获取到最新的值。

2. 线程的五大状态

  • 建立状态当用 new 操做符建立一个线程的时候
  • 就绪状态调用 start 方法,处于就绪状态的线程并不必定立刻就会执行 run 方法,还须要等待CPU的调度
  • 运行状态CPU 开始调度线程,并开始执行 run 方法
  • 阻塞状态线程的执行过程当中因为一些缘由进入阻塞状态好比:调用 sleep 方法、尝试去获得一个锁等等
  • 死亡状态run 方法执行完 或者 执行过程当中遇到了一个异常

3.悲观锁与乐观锁

  • 悲观锁:每次操做都会加锁,会形成线程阻塞。
  • 乐观锁:每次操做不加锁而是假设没有冲突而去完成某项操做,若是由于冲突失败就重试,直到成功为止,不会形成线程阻塞。

4.线程之间的协做:wait/notify/notifyAll等

5.synchronized 关键字

6.CAS

CAS全称是Compare And Swap,即比较替换,是实现并发应用到的一种技术。操做包含三个操做数 —— 内存位置(V)、预期原值(A)和新值(B)。 若是内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 。不然,处理器不作任何操做。

7.线程池

若是咱们使用线程的时候就去建立一个线程,虽然简单,可是存在很大的问题。若是并发的线程数量不少,而且每一个线程都是执行一个时间很短的任务就结束了,这样频繁建立线程就会大大下降系统的效率,由于频繁建立线程和销毁线程须要时间。线程池经过复用能够大大减小线程频繁建立与销毁带来的性能上的损耗。

高并发技术方案:提升高并发能力

1.分布式缓存:redis、memcached等,结合CDN来解决图片文件等访问。

2.消息队列中间件:activeMQ等,解决大量消息的异步处理能力。

3.应用拆分:一个工程被拆分为多个工程部署,利用dubbo解决多工程之间的通讯。

4.数据库垂直拆分和水平拆分(分库分表)等。

5.数据库读写分离,解决大数据的查询问题。

6.还能够利用nosql ,例如mongoDB配合mysql组合使用。

7.还须要创建大数据访问状况下的服务降级以及限流机制等。

以上内容但愿帮助到你们,不少PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提高,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货须要的能够免费分享给你们,须要的能够加入个人官方群点击此处

相关文章
相关标签/搜索