高并发思路

本文介绍了提高服务器并发处理能力的方法,包括使用乐观锁防止脏读写、读写分离、分离资源存储、CDN加速、动态转静态、缓存、服务器镜像、负载均衡等手段,并提到了分库分表、合理使用Synchronized等数据库和编程层面的优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务器性能、数据库性能、网络连接甚至编程语言都会影响并发数。但总结起来,高并发无非就是拆拆拆分分分。


乐观锁


乐观锁是数据库优化的典范。即,通过对数据条目的“版本控制”,来约束数据,防止脏读写操作。在实际操作中并不独占资源。在设计思路上是通过引入“版本”概念来放弃资源约束。


举例:


数据库中设置CREATE TABLE tbl ( id varchar(32) , /** 乐观锁字段 **/ optimistic_lock numeric(12) )

java 中使用 spring @version 关键字,

@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>


并在 dao 层调用时进行读写分别调用。

为保证 master/slave 服务器的数据一致性,两个服务器间会有同步。


分离 resource 存储


我们以图片分离存储为例,在 web 场景中,页面加载的图片是非常消耗资源的,通常我们会放在其他的服务器上来进行存储,针对图片资源进行优化加速。这就像是 java 编程理念中的“解耦”。

同理,js 文件、css 文件、zip 文件等皆可通过这种方式进行分离,再配合 CDN 加速技术,实现访问速度和并发能力的提升。


CDN 加速


CDN 加速就是在靠近用户的物理位置上架设服务器,根据就近原则使用户访问物理上最近的服务器来节省网络传输时间。

通常这种 CDN 加速的服务器分散到全国设置世界各地,并适当采用的缓存、专线等技术。

为保证数据的一致性,服务器间进行同步。


动态转静态


我们把一次 HTTP 请求的时间分成几段:request--> calculate--> response,那么静态资源简化甚至省略了 calculate 步骤,实现请求-->响应的简单模型。


我们可以将“幂等”的请求进行静态化处理。我们举例来理解这件事:

比如用户想快速的查询自己近一个月的交易总额,按照传统模式我们需要服务器在用户查询后进行累加计算来统计用户这一个月的交易数据。那么我们可以在每天凌晨运行一次 spring batch 来统计所有用户的交易总额信息,并存储在用户对应的表里,当用户查询时,直接获取。


缓存


缓存可以理解为动态转静态的一个实例。也可以理解为将硬盘上的数据存入内存方便读取。通常设计为 key-value 形式。


以常用的 memcache 举例:

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 优化,比如尽量避免全表扫描

我个人理解的高并发就是,把传统的“单元操作”进行拆分,分的越细致越好。


出处:https://www.v2ex.com/t/364701


版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。


-END-


### 3. iOS 高并发处理思路与最佳实践 在 iOS 开发中,高并发处理主要涉及多线程、异步任务调度、资源竞争控制以及性能优化等多个方面。由于移动设备的硬件资源有限,iOS 应用必须在保证响应性的同时,合理调度后台任务,避免主线程阻塞和内存泄漏等问题。 #### 3.1 利用 GCD 实现高效的并发控制 Grand Central Dispatch(GCD)是 iOS 平台原生的并发任务调度机制,它通过系统级线程管理,将任务分发到适当的队列中执行。开发者可以使用串行队列保证任务顺序执行,使用并发队列实现多任务并行处理。 例如,使用全局并发队列执行后台网络请求: ```objective-c dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ // 执行网络请求或耗时操作 dispatch_async(dispatch_get_main_queue(), ^{ // 回到主线程更新 UI }); }); ``` GCD 提供了多种同步机制,如 `dispatch_semaphore` 和 `dispatch_group`,可有效解决资源竞争和任务依赖问题[^2]。 #### 3.2 使用 OperationQueue 实现任务依赖与优先级控制 `OperationQueue` 是基于 GCD 的封装,提供了更高级的任务调度功能,如任务依赖、优先级设置和取消操作。开发者可以通过 `addDependency:` 方法定义任务之间的执行顺序,从而构建复杂的异步任务流程。 ```objective-c NSOperationQueue *queue = [[NSOperationQueue alloc] init]; NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{ // 任务1 }]; NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{ // 任务2 }]; [operation2 addDependency:operation1]; [queue addOperation:operation1]; [queue addOperation:operation2]; ``` 该机制适用于需要动态调整任务顺序和优先级的复杂业务场景,如电商系统的订单处理流程[^1]。 #### 3.3 避免主线程阻塞与死锁问题 在高并发场景中,主线程负责处理 UI 更新和用户交互,任何耗时操作都应提交到后台线程执行。若在主线程中同步执行耗时任务或等待异步任务完成,可能导致界面卡顿甚至死锁。 以下代码可能造成死锁: ```objective-c dispatch_queue_t queue = dispatch_queue_create("com.example.queue", DISPATCH_QUEUE_SERIAL); dispatch_sync(queue, ^{ dispatch_sync(dispatch_get_main_queue(), ^{ // 死锁:主线程正在等待 queue 完成,而 queue 又在等待主线程释放 }); }); ``` 为避免此类问题,应始终使用异步方式提交任务到非主线程队列,或在必要时使用 `dispatch_async` 替代 `dispatch_sync`[^2]。 #### 3.4 利用缓存与数据库优化提升并发性能 在高并发访问场景中,频繁访问数据库或网络资源可能导致性能瓶颈。为此,iOS 开发中应采用本地缓存策略,如 `NSCache` 或 `NSUserDefaults`,以减少重复请求。同时,使用 Core Data 或 SQLite 进行本地数据持久化,并结合 GCD 实现异步数据库访问,可有效提升系统响应速度。 例如,使用 GCD 异步写入 Core Data: ```objective-c dispatch_queue_t queue = dispatch_queue_create("com.example.coredata", 0); dispatch_async(queue, ^{ NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; // 执行 Core Data 操作 dispatch_async(dispatch_get_main_queue(), ^{ // 回调更新 UI }); }); ``` 该方式可避免主线程阻塞,提高数据库操作的并发能力。 #### 3.5 利用锁机制与原子操作保障线程安全 在多线程环境下,多个任务同时访问共享资源可能导致竞态条件。iOS 提供了多种线程同步机制,如 `@synchronized`、`NSLock`、`NSRecursiveLock` 和 `OSAtomic` 等。 例如,使用 `@synchronized` 保护共享资源: ```objective-c - (void)updateSharedData:(id)data { @synchronized(self) { // 修改共享数据 } } ``` 此外,使用 `dispatch_barrier_async` 在并发队列中执行写操作,可确保读写操作的线程安全性和一致性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值