服务器性能、数据库性能、网络链接甚至编程语言都会影响并发数。但总结起来,高并发无非就是拆拆拆分分分。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服务器的数据一致性,两个服务器间会有同步。数据库
咱们以图片分离存储为例,在web场景中,页面加载的图片是很是消耗资源的,一般咱们会放在其余的服务器上来进行存储,针对图片资源进行优化加速。这就像是java编程理念中的“解耦”。
同理,js文件、css文件、zip文件等皆可经过这种方式进行分离,再配合CDN加速技术,实现访问速度和并发能力的提高。apache
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"/>
分库、分表
合理的Synchronized
基本的SQL优化,好比尽可能避免全表扫描
我我的理解的高并发就是,把传统的“单元操做”进行拆分,分的越细致越好。