对PHP高并发性的几点思考

对PHP高并发性的几点思考
我的想法如下(伪代码):

SQL1:查询商品库存

如果(库存编号> 0)
{
创建订单…
SQL2:同时库存- 1
}
在没有并发,这个过程似乎是比较正常的,而两人承担的订单和库存只有1,在SQL1相两个人查询到库存量>0,最后是SQL2实施,最后进入1库存,超售,这不是我们想要的结果。

我总结了流行的想法来解决这个问题。

1、使用额外的单进程处理队列,将订单请求放置在队列中,在逐一处理之后不会出现并发问题。然而,额外的开放的背景、过程和延迟的问题不会被认为是在这里。在这里我可以使用消息队列,我们用memcacheq,广播。例如:有100张为用户抢,所以你可以把这100张票在缓存中,不锁的阅读和写作的时候。当并发量大,大约有500人抢票成功,所以500背后的请求可以直接转移到500的人都在activity.400结束的静态页面是不可能得到的商品。因此只能购买第一批100人根据进入队列的顺序。接下来的400人直接进入活动页面的结束。当然,500人走在F或者一个例子,说明可以自行调整多少。活动结束页面必须使用静态页面,不要使用数据库。这减少了数据库的压力。

2.mysql乐观锁,这意味着总的库存是2,如果将立即提交抢购,股票+ 1,那么3是库存和订单生成,然后查询库存更新库存前(因为订单生成理应库存1,但先别着急,再次检查库存返回的结果是3看数量的预期),库存(这里的预期库存为3)是一致的,不一致的将提示用户回滚,库存不足。这里是一个悲观锁,也许有朋友会问,那一定是乐观锁,我谈论的悲观乐观锁我知道。

悲观锁和乐观锁是资源并发锁的两种常见设计思想,也是并发编程中的一个非常基本的概念,本文系统介绍了两种常见的数据库数据锁机制。

悲观锁(悲观锁)

悲观锁的特点是先锁后再做业务,也就是悲观地认为锁很可能会失败。因此,我们必须首先确保锁是成功的,那么企业操作。一般来说,一个锁两支票和三的更新是指一个悲观锁的使用。一般来说,在数据库上的悲观锁需要的数据库本身,那就是支持,通过常用的选择…更新操作实现悲观锁。当数据库执行选择的更新,它会在选择数据行的行锁。因此,如果尝试选择同一行(等待行锁被释放),则另一个并发更新执行将被拒绝,从而实现锁定效果。在当前事务结束时,选择为更新获得的行锁将自动释放,因此必须在事务中使用。

需要注意的是,不同的数据库有不同的实现和支持选择更新的方法。例如,Oracle支持选择更新无需等待,指的是如果你不能立即得到一个锁,你不报道,但是MySQL不会另外没有号,MySQL也有已经在选择更新语句的执行扫描所有行将锁定问题,这使它容易产生问题。因此,如果悲观锁用的是MySQL,有必要确定指标,而不是全表扫描。

乐观锁(乐观锁)

第一个乐观锁的特点为业务操作,而不是不能不采取锁。乐观的是,锁大多是成功的,所以它是好的最后一步,在最后一步的实际更新的数据。

数据库上乐观锁的实现是完全逻辑的,不需要数据库的特殊支持。一般做法是在需要锁定的数据上添加版本号或时间戳,然后执行如下操作:
1。选择数据old_data,版本为old_version从…;
2。业务经营所获得的数据的基础上,new_data和new_version得到
三.更新数据= new_data,版本= new_version版本= old_version
如果(更新行> 0){
乐观锁定成功操作完成
{人}
乐观锁捕获失败,回滚和重试
}
无论是在交易的乐观锁其实没有关系,这是潜在的机制:在数据库更新时,相同的线是不允许的并发性,即每个数据库执行一个UPDATE语句将锁定写作更新,直到线被成功更新前释放。所以在获得需要的业务操作之前锁定数据的当前版本号进行,然后实际更新数据,我们将再次比较版本号确认与以前的采集和更新版本号,所以我们可以确认有无并发修改。如果更新失败,认为旧版本的数据被修改而不被被改进的.同时,我们认为,获取锁的失败需要回滚整个业务操作,并根据需要重试整个过程:

总结

乐观锁比悲观锁要便宜,不需要锁失败,但是一旦发生故障,回滚代价就比较大,所以它适用于锁失效概率相对较小的情况,从而提高系统的并发性能
乐观锁也适用于一些更为具体的场景,如悲观锁不能应用于业务操作,如维护与数据库的连接
三.根据更新的结果,我们可以添加一个判断条件时,SQL2是更新,表设置,库存= XXX在哪里,股票> 0。如果我们返回false,我们将解释股票不足并回滚交易。

4、在文件独占锁的帮助下,在处理订单请求时,用文件夹锁定文件。如果锁故障指示正在处理其他订单,则等待或提示用户忙。

一般代码如下:

阻塞(等待)模式
< PHP
$ FP = fopen(锁。txt
如果(羊群($ FP,lock_ex)) / /锁定当前指针,,,
{
…处理订单
羊群($ FP,lock_un);
}
Fclose($ FP);
>
非阻塞模式
< PHP
$ FP = fopen(锁。txt
如果(羊群($ FP,lock_ex | lock_nb))
{
…处理订单
羊群($ FP,lock_un);
}
其他的
{
系统忙,请稍后再试。
}

Fclose($ FP);
>
5、如果是分布式集群服务器,它需要一个或多个队列服务器。有轻微的差异,Xiaomi和淘宝的抢购。小米的快速抓取是获得配额的最快方式。如果你想,你可以解决订单。而淘宝侧重于过滤支付时,制作多层过滤,例如,出售10的产品,他将获得超过10的用户抢,并发在付款时支付,然后过滤,在闪光的水平减少并发量。

6。使用redis锁product_lock_key作为票锁在product_key Redis存在时,所有的用户都可以进入下一个过程。当进入支付过程中,第一家店萨德(product_lock_key,1)来使用,如果它返回成功进入支付过程。如果没有,说明有人进入付款过程,那么线程等待N秒,与萨德操作执行递归。

当然,类似于淘宝11架构的狂暴比我说的这些更复杂的解决方案。更多…需要不断下降以获得经验…在战斗。我们善于分享解决方案,明确信息哈萨克斯坦。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部