高併發思路

服務器性能、數據庫性能、網絡鏈接甚至編程語言都會影響併發數。但總結起來,高併發無非就是拆拆拆分分分css

樂觀鎖

樂觀鎖是數據庫優化的典範。即,經過對數據條目的「版本控制」,來約束數據,防止髒讀寫操做。在實際操做中並不獨佔資源。在設計思路上是經過引入「版本」概念來放棄資源約束。
舉例:
數據庫中設置`CREATE TABLE tbl (java

id varchar(32) ,
/** 樂觀鎖字段 **/
optimistic_lock numeric(12)

)`
java中使用spring @version 關鍵字,web

@Version  
@Column(name = "optimistic_lock", columnDefinition = "INTEGER")  
private long optimisticLock;

讀寫分離

數據庫中的讀寫分離知識數據庫集羣的一種典型。並不必定須要按讀寫分離數據庫,也能夠根據特定的業務邏輯來進行分開操做。
咱們以讀寫分離舉例:
一般設計兩個數據庫master和slave數據服務器,在spring中配置兩個datasource
<!-- 定義數據源,使用本身實現的數據源 -->
<bean id="dataSource" class="cn.itcast.usermanage.spring.DynamicDataSource">
<!-- 設置多個數據源 -->
<property name="targetDataSources">
<map key-type="java.lang.String">
<!-- 這個key須要和程序中的key一致 -->
<entry key="master" value-ref="masterDataSource"/>
<entry key="slave" value-ref="slave01DataSource"/>
</map>
</property>
<!-- 設置默認的數據源,這裏默認走寫庫 -->
<property name="defaultTargetDataSource" ref="masterDataSource"/>
</bean> spring

並在dao層調用時進行讀寫分別調用。
爲保證master/slave服務器的數據一致性,兩個服務器間會有同步。數據庫

分離resource存儲

咱們以圖片分離存儲爲例,在web場景中,頁面加載的圖片是很是消耗資源的,一般咱們會放在其餘的服務器上來進行存儲,針對圖片資源進行優化加速。這就像是java編程理念中的「解耦」。
同理,js文件、css文件、zip文件等皆可經過這種方式進行分離,再配合CDN加速技術,實現訪問速度和併發能力的提高。apache

CDN加速

CDN加速就是在靠近用戶的物理位置上架設服務器,根據就近原則使用戶訪問物理上最近的服務器來節省網絡傳輸時間。
一般這種CDN加速的服務器分散到全國設置世界各地,並適當採用的緩存、專線等技術。
爲保證數據的一致性,服務器間進行同步。編程

動態轉靜態

咱們把一次HTTP請求的時間分紅幾段:request--> calculate--> response,那麼靜態資源簡化甚至省略了calculate步驟,實現請求-->響應的簡單模型。
咱們能夠將「冪等」的請求進行靜態化處理。咱們舉例來理解這件事:
好比用戶想快速的查詢本身近一個月的交易總額,按照傳統模式咱們須要服務器在用戶查詢後進行累加計算來統計用戶這一個月的交易數據。那麼咱們能夠在天天凌晨運行一次spring batch 來統計全部用戶的交易總額信息,並存儲在用戶對應的表裏,當用戶查詢時,直接獲取。緩存

緩存

緩存能夠理解爲動態轉靜態的一個實例。也能夠理解爲將硬盤上的數據存入內存方便讀取。一般設計爲key-value形式。
以經常使用的memcache舉例:tomcat

MemCachedClient mc = new MemCachedClient();  
String key = "cacheKey1";  
Object value = SomeClass.getObject();  
mc.set(key, value);

服務器鏡像

與CDN加速的設計相似,根據不一樣地域、網絡服務商等網絡條件假設多個服務器的「鏡像」來實現網絡傳輸環節的優化。
以此咱們能夠引出「負載均衡」。服務器

負載均衡

負載均衡的設計理念是根據資源請求消耗狀況來自動調節平衡。
好比咱們在多個端口配置啓動tomcat:

<Connector port="11009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

<Connector port="12009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

其餘

  1. 分庫、分表

  2. 合理的Synchronized

  3. 基本的SQL優化,好比儘可能避免全表掃描

我我的理解的高併發就是,把傳統的「單元操做」進行拆分,分的越細緻越好。

相關文章
相關標籤/搜索