高併發(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.併發編程三要素
2. 線程的五大狀態
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等多個知識點高級進階乾貨須要的能夠免費分享給你們,須要的能夠加入個人官方羣點擊此處。