一,高並發的理解
1.概念:就是短時間內遇到大量操作請求,導致站點服務器/db服務器資源被占滿甚至嚴重時直接導致宕
2.影響:沒有做高並發預處理的系統會給用戶很差的體驗感;
3.系統好壞的衡量:衡量一個系統的好壞,除了業務外,還有就是系統的吞吐量(單位時間內處理的請求數)-----QPS(每秒鍾能處理的請求數)和響應時間
二,區分一下高並發和多線程的關系----曾經我也是單純的理解高並發就是多線程,錯的很離譜
1.多線程的理解:
多線程是java的特性,因為現在cpu都是多核多線程的,可以同時執行幾個任務,為了提高jvm的執行效率,java提供了這種多線程的機制,以增強數據處理效率。
多線程對應的是cpu,高並發對應的是訪問請求,可以用單線程處理所有訪問請求,也可以用多線程同時處理訪問請求。
在過去單CPU時代,單任務在一個時間點只能執行單一程序。之后發展到多任務階段,計算機能在同一時間點並行執行多任務或多進程。雖然並不是真正意義上的“同一時間點”,而是多個任務或進程共享一個CPU,並交由操作系統來完成多任務間對CPU的運行切換,以使得每個任務都有機會獲得一定的時間片運行。
再后來發展到多線程技術,使得在一個程序內部能擁有多個線程並行執行。一個線程的執行可以被認為是一個CPU在執行該程序。當一個程序運行在多線程下,就好像有多個CPU在同時執行該程序
2.多線程和高並發的關系
要想系統能夠適應高並發狀態,則需要從各個方面進行系統優化,包括,硬件、網絡、系統架構、開發語言的選取、數據結構的運用、算法優化、數據庫優化等…而多線程只是其中解決方法之一。
3.並發編程的幾個要素
- 原子性原子,即一個不可再被分割的顆粒。在Java中原子性指的是一個或多個操作要么全部執行成功要么全部執行失敗。
- 有序性程序執行的順序按照代碼的先后順序執行。(處理器可能會對指令進行重排序)
- 可見性當多個線程訪問同一個變量時,如果其中一個線程對其作了修改,其他線程能立即獲取到最新的值
4.使用多線程技術編程需要注意的幾個點
4.1 清楚一個線程的五個狀態
4.2 理解悲觀鎖和樂觀鎖
4.3懂線程之間的協作(wait/sleep/notify等)
4.4 知道什么時候使用線程池
5.高並發的場景
一般像火車票搶票,秒殺 系統,雙11或者京東618活動等這種太明顯不過了,這種還是正常的業務范圍,蠻好理解的,還有一種就是惡意的攻擊,導致系統的某個功能近乎癱瘓,比如驗證碼的請求等,
假設系統的一些架構方便的並發措施都做到位了,例如,重要系統配備了好的資源(高質量服務器),同時使用集群方式提供服務,增加了redis集群配置等,最后需要處理的就是底層數據庫那塊了,
不然前面那么多請求都吃下來了,到了底層掉鏈子跟不上那也不行:
在此,個人理解為並發無非就是並發讀和並發寫,並發讀還好,一般使用緩存就可以搞定,並發寫技術就比較多了;
一般我們都知道 並發時最怕的就是對共享變量的同時訪問導致臟數據的產生,所以一般會加鎖:對象鎖(例如:syncrinized等關鍵字)和 分布式鎖(數據庫鎖,redis,zookeeper)
對象鎖顧名思義就是鎖住當前對象--只能用在單服務器上,對於分布式系統或者單系統分布式部署時對共享資源的訪問就必須使用分布式鎖了,此時對象鎖沒法用了
像秒殺系統可以使用緩存讓還有數量時都可以看到,而在開搶后得看個人運氣了(網絡等原因),此時使用樂觀鎖(共享鎖)就搞定了嘛
像銀行的消費后更新銀行卡余額,使用悲觀鎖(排斥鎖)就可以
具體想搞清楚分布式鎖的請看下面這個鏈接:https://www.cnblogs.com/toutou/archive/2018/09/24/9554974.html
6.高並發的技術解決方案

a.分布式緩存:redis、memcached等,
b.系統采用水平方向擴展,盡量使用集群來分散處理多請求。
c.應用拆分:一個工程被拆分為多個工程部署,利用dubbo解決多工程之間的通信。
d.數據庫分庫分表等。
e .數據庫讀寫分離,解決大數據的查詢問題。
f.還可以利用nosql ,例如mongoDB配合mysql組合使用。
g.還需要建立大數據訪問情況下的服務降級以及限流機制等。
h.消息隊列中間件:activeMQ等,解決大量消息的異步處理能力。
.............
