位置: 编程技术 - 正文

关于php 高并发解决的一点思路(php处理并发有哪些技术)

编辑:rootadmin

推荐整理分享关于php 高并发解决的一点思路(php处理并发有哪些技术),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php 高并发解决方案,php高并发三种解决方法,php应对高并发,php高并发三种解决方法,php高并发架构,php高并发三种解决方法,php高并发三种解决方法,php高并发三种解决方法,内容如对您有帮助,希望把文章链接给更多的朋友!

我的思路如下(伪代码):

sql1:查询商品库存

当没有并发时,上面的流程看起来是再正常不过了,假设同时两个人下单,而库存只有1个了,在sql1阶段两个人查询到的库存都是>0的,于是最终都执行了sql2,库存最后变为-1,超售了,这不是我们想要的结果吧。

解决这个问题比较流行的思路我总结了下:1.用额外的单进程处理一个队列,下单请求放到队列里,一个个处理,就不会有并发的问题了,但是要额外的开启后台进程以及延迟问题,这里暂不予考虑。这里我可使用消息队列,我们常用到Memcacheq、Radis。 比如:有张票可供用户抢,那么就可以把这张票放到缓存中,读写时不要加锁。 当并发量大的时候,可能有人左右抢票成功,这样对于后面的请求可以直接转到活动结束的静态页面。进去的个人中有个人是不可能获得商品的。所以可以根据进入队列的先后顺序只能前个人购买成功。后面个人就直接转到活动结束页面。当然进去个人只是举个例子,至于多少可以自己调整。而活动结束页面一定要用静态页面,不要用数据库。这样就减轻了数据库的压力。2.mysql乐观锁,意思是比如总库存是2,抢购事件提交时,立马将库存+1,那么此时库存是3,然后订单生成后,在更新库存前再查询一次库存(因为订单生成理所当然库存-1,但是先不急,再查一次库存返回结果是3),看看跟预期的库存数量(这里预期的库存是3)是否保持一致,不一致就回滚,提示用户库存不足。这里说道悲观锁,可能有朋友会问,那一定有乐观锁了吧&#;&#;这里我就浅谈下我所了解的悲观与乐观锁了

悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念。本文将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍。

悲观锁(Pessimistic Lock)

悲观锁的特点是先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。通常所说的“一锁二查三更新”即指的是使用悲观锁。通常来讲在数据库上的悲观锁需要数据库本身提供支持,即通过常用的select … for update操作来实现悲观锁。当数据库执行select for update时会获取被select中的数据行的行锁,因此其他并发执行的select for update如果试图选中同一行则会发生排斥(需要等待行锁被释放),因此达到锁的效果。select for update获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用。

这里需要注意的一点是不同的数据库对select for update的实现和支持都是有所区别的,例如oracle支持select for update no wait,表示如果拿不到锁立刻报错,而不是等待,mysql就没有no wait这个选项。另外mysql还有个问题是select for update语句执行中所有扫描过的行都会被锁上,这一点很容易造成问题。因此如果在mysql中用悲观锁务必要确定走了索引,而不是全表扫描。

乐观锁(Optimistic Lock)

关于php 高并发解决的一点思路(php处理并发有哪些技术)

乐观锁的特点先进行业务操作,不到万不得已不去拿锁。即“乐观”的认为拿锁多半是会成功的,因此在进行完业务操作需要实际更新数据的最后一步再去拿一下锁就好。

乐观锁在数据库上的实现完全是逻辑的,不需要数据库提供特殊的支持。一般的做法是在需要锁的数据上增加一个版本号,或者时间戳,然后按照如下方式实现:

乐观锁是否在事务中其实都是无所谓的,其底层机制是这样:在数据库内部update同一行的时候是不允许并发的,即数据库每次执行一条update语句时会获取被update行的写锁,直到这一行被成功更新后才释放。因此在业务操作进行前获取需要锁的数据的当前版本号,然后实际更新数据时再次对比版本号确认与之前获取的相同,并更新版本号,即可确认这之间没有发生并发的修改。如果更新失败即可认为老版本的数据已经被并发修改掉而不存在了,此时认为获取锁失败,需要回滚整个业务操作并可根据需要重试整个过程。好吧,在此唠叨总结下这两个锁:

总结

乐观锁在不发生取锁失败的情况下开销比悲观锁小,但是一旦发生失败回滚开销则比较大,因此适合用在取锁失败概率比较小的场景,可以提升系统并发性能

乐观锁还适用于一些比较特殊的场景,例如在业务操作过程中无法和数据库保持连接等悲观锁无法适用的地方

3.根据update结果来判断,我们可以在sql2的时候加一个判断条件update table set 库存=xxx where 库存>0,如果返回false,则说明库存不足,并回滚事务。4.借助文件排他锁,在处理下单请求的时候,用flock锁定一个文件,如果锁定失败说明有其他订单正在处理,此时要么等待要么直接提示用户"服务器繁忙"

大致代码如下:阻塞(等待)模式

非阻塞模式

5.如果是分布式集群服务器,就需要一个或多个队列服务器 小米和淘宝的抢购还是有稍许不同的,小米重在抢的那瞬间,抢到了名额,就是你的,你就可以下单结算。而淘宝则重在付款的时候的过滤,做了多层过滤,比如要卖件商品,他会让大于的用户抢到,在付款的时候再进行并发过滤,一层层的减少一瞬间的并发量。

6.使用redis锁 product_lock_key 为票锁key 当product_key存在于redis中时,所有用户都可以进入下单流程。 当进入支付流程时,首先往redis存放sadd(product_lock_key, “1″),如果返回成功,进入支付流程。如果不成,则说明已经有人进入支付流程,则线程等待N秒,递归执行sadd操作。

当然类似于淘宝双的疯抢架构远远比我说滴这些复杂多啦....更多解决方案需要不停滴去实战中获取心得....大家有好的解决思路清随时共享留言哈

php正则表达式基本知识与应用详解【经典教程】 本文实例讲述了php正则表达式基本知识与应用。分享给大家供大家参考,具体如下:概述正则表达式是一种描述字符串结果的语法规则,是一个特定的

php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】 本文实例讲述了php实现不通过扩展名准确判断文件类型的方法。分享给大家供大家参考,具体如下:第一种方法通过php的finfo_file()$handle=finfo_open(FILEINFO_M

PHP使用finfo_file()函数检测上传图片类型的实现方法 本文实例讲述了PHP使用finfo_file()函数检测上传图片类型的实现方法。分享给大家供大家参考,具体如下:在输入输出中,文件的交互必不可少,比如文

标签: php处理并发有哪些技术

本文链接地址:https://www.jiuchutong.com/biancheng/292542.html 转载请保留说明!

上一篇:PHP无限极分类函数的实现方法详解(php 无限级分类)

下一篇:php正则表达式基本知识与应用详解【经典教程】(php 正则)

  • 航天信息金税盘未打开
  • 个人独资企业出资额是注册资本吗
  • 汇算清缴时发现去年的成本少确认了报表怎么填列
  • 测绘费开票需备注吗
  • 小规模纳税人每个季度超过了30万怎么办
  • 公益性捐赠的税收优惠政策
  • 未达起征点是什么
  • 代理记账公司收费项目
  • 下个月的发票可以报销上个月的费用吗
  • 建筑安装企业成本费用包括哪些
  • 公司报销员工的首饰可以税前列支吗
  • 小企业收到下列票据后,银行存款账户不变的是
  • 注册资金印花税是资金账簿吗
  • 税务小规模定律是什么意思
  • 转出未交增值税怎么算
  • 小规模纳税人税费怎么算
  • 去税局代开增值税专票需要什么资料?
  • 库存与账面不符怎么办
  • 充积分送手机
  • 华硕p8h61主板升级更换什么主板合适
  • mac电脑安装win10系统报错
  • 母公司是否应替子公司承担违约责任
  • 超市发购物卡给员工会计分录
  • 错账按产生原因来看有两种
  • 工资里的其他应收款是什么
  • win11 pin失效
  • win10的病毒隔离有用吗
  • 提取的坏账准备怎么算
  • kcleaner.exe是什么
  • 编制竣工决算的主要依据
  • yolov5模型训练
  • php foo
  • 工资总额提取福利费
  • 数据结构考试内容
  • Linux(CentOS)下PHP扩展PDO编译安装的方法
  • 新会计准则开办费如何做账务处理
  • 其他业务收入是什么意思
  • jquery箭头函数
  • 深入理解php类的知识
  • 蔬菜开票税率是多少
  • 小规模纳税人三减一政策
  • 营改增后简易计税是多少税率
  • 股东权益合计是净资产吗
  • 企业培训费怎么入账
  • 协会申报材料
  • 净利润为负数还计提盈余公积吗
  • 私人借款条怎么写合法
  • 仓储费计入哪个部门的费用
  • 母公司划拨土地给全资子公司需要上税吗?
  • 酒店购买的床单被罩怎么入账
  • 商场水电费应该由谁承担
  • 公司收到美元怎么交税啊
  • 公司营运成本
  • 工业企业外购材料采购成本包括
  • 正确使用气体钢瓶的原则
  • sql的常用函数
  • win7一键升级到win10
  • bootcamp您的磁盘未能分区
  • 64位win10预览版10565更新补丁KB3105208后蓝屏怎么办?
  • WinXP下载东西总提示找不到文件的原因及解决方法
  • win8 自动登录
  • 开启win7
  • javascriptz
  • Web Safe Color Pallette
  • html:xt
  • python 解析js
  • unity移动游戏开发
  • unity怎么写接口
  • Python装饰器基础详解
  • js继承的方式
  • jQuery模拟select实现下拉菜单功能
  • Android SimpleAdapter
  • 陕西电子税务局官网登录入口网址
  • 电脑多窗口同步操作
  • 江苏联通客服电话人工服务号码
  • 关税下降的好处
  • 契税计税依据含装修费吗
  • 江苏国税电子税务局官网
  • 延期审理税务案件的后果
  • 煤炭资源税税率选煤税率多少黑龙江
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设