`
liu86th
  • 浏览: 113569 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

PHP高并发解决方案

    博客分类:
  • PHP
 
阅读更多

最近在做一个团购项目,遇到个问题,就是在抢购、秒杀、抽奖等活动时,库存数量有限,但是同时下单人数超过了库存数量,就会导致商品超售问题。那么我们怎么来解决这个问题呢,我的思路如下: 

sql1:查询商品库存
if(库存数量 > 0)
{
  //生成订单...
  sql2:库存-1
}

 

当没有并发时,上面的流程看起来是如此完美,假设同时两个人下单,而库存只有1个了,在sql1阶段两个人查询到的库存都是>0的,于是最终都执行了sql2,库存最后变为-1,超售了,要么补库存,要么等用户投诉吧。

 

 

 

解决这个问题比较流行的思路:

1.用额外的单进程处理一个队列,下单请求放到队列里,一个个处理,就不会有并发的问题了,但是要额外的后台进程以及延迟问题,不予考虑。

2.数据库乐观锁,大致的意思是先查询库存,然后立马将库存+1,然后订单生成后,在更新库存前再查询一次库存,看看跟预期的库存数量是否保持一致,不一致就回滚,提示用户库存不足。

3.根据update结果来判断,我们可以在sql2的时候加一个判断条件update ... where 库存>0,如果返回false,则说明库存不足,并回滚事务。

4.借助文件排他锁,在处理下单请求的时候,用flock锁定一个文件,如果锁定失败说明有其他订单正在处理,此时要么等待要么直接提示用户"服务器繁忙"

 

 

 

本文要说的是第4种方案,大致代码如下:

阻塞(等待)模式

<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX))   //锁定当前指针,,,
{
  //..处理订单
  flock($fp,LOCK_UN);
}
fclose($fp);
?>
非阻塞模式
 
<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX | LOCK_NB))
{
  //..处理订单
  flock($fp,LOCK_UN);
}
else
{
  echo "系统繁忙,请稍后再试";
}
 
fclose($fp);
?>

 

分享到:
评论

相关推荐

    redis高并发解决方案

    redis高并发解决方案

    mysql高并发解决方案

    这个是很好解决高并发的一个方案,大家可以下载来看看,一同进步

    PHP高并发和大流量解决方案整理

    一、高并发的概念 在互联网时代,并发,高并发通常是指并发访问。也就是在某个时间点,有多少个访问同时到来。 二、高并发架构相关概念 1、QPS (每秒查询率) : 每秒钟请求或者查询的数量,在互联网领域,指每秒响应...

    面试题高并发和大流量解决方案篇.pdf

    面试题高并发和大流量解决方案篇

    mysql大数据分库和分表 php解决方案

    本文讲的是mysql大数据分库和分表 php解决方案。 mysql分库分表方案、mysql 分库方案、php实现mysql分库分表、mysql高并发解决方案。

    PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)

    主要介绍了PHP+Redis链表解决高并发下商品超卖问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

    php结合redis实现高并发下的抢购、秒杀功能的实例

    1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少(”超卖”问题) 对于第一个问题,已经很容易想到用缓存来处理抢购,避免直接操作数据库,例如使用Redis。 重点在于第二个问题 常规写法: 查询出...

    如何利用Redis锁解决高并发问题详解

    redis锁处理高并发问题十分常见,下面这篇文章主要给大家介绍了关于如何使用Redis锁解决高并发问题的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧

    高并发的抢购功能

    主要提供解决方案和代码功能。运用了redis,innodb,事务处理。

    PHP+Redis事务解决高并发下商品超卖问题(推荐)

    利用redis的高性能和事务特性来解决线上优惠券被超库存抢购的问题,下面我给出我临时解决这个问题的第一版的伪代码,去掉了一些细节: /** * 抢优惠券(秒杀) * @param int $couponId 商品ID * @param

    PHP商品秒杀问题解决方案实例详解【mysql与redis】

    本文实例讲述了PHP商品秒杀问题解决方案。分享给大家供大家参考,具体如下: 引言 假设num是存储在数据库中的字段,保存了被秒杀产品的剩余数量。 if($num &gt; 0){ //用户抢购成功,记录用户信息 $num--; } 假设在...

    超级IIS S6.1

    超级IIS经过二年多的中国程序员编程习惯调查,一年多的公测,经过无数次的适应中国程序员编程...超级IIS同时无缝支持了PHP、ASP、ASP.NET、JSP等多种流行编程语言,这在当前应用比较广泛的WEB服务器软件中非常难得。

    高性能高并发服务器架构大全

     web软件设计时考虑你的性能解决方案 190  大型Java Web系统服务器选型问题探讨 193  高并发高流量网站架构 210 1.1 互联网的发展 210 1.2 互联网网站建设的新趋势 210 1.3 新浪播客的简介 211 2.1 镜像...

    php uniqid()函数解决高并发生成唯一标识方案

    上次研究了雪花算法,虽然不错,但是感觉限制太多了,而且也比较复杂,要是本地用wamp一类的来测试还容易出问题,所以找了一种更加简便的方法,PHP的uniqid函数,很方便实用,也很简单,就是一行代码就解决了,网上...

    php中并发读写文件冲突的解决方案

    在这里提供4种高并发读写文件的方案,各有优点,可以根据自己的情况解决php并发读写文件冲突的问题。

    图片过大引起的内存溢出解决方案

    使用BitmapFactory加载图片时,如果图片过大可能引起OutOfmemory溢出的问题。解决办法。

    基于php班级管理系统.zip

    无论是处理大规模数据集还是高并发请求,该项目都能够保持优秀的性能表现。 灵活的扩展性:MySQL具有良好的扩展性,可以轻松地扩展到更大的数据集和更高的负载。该项目可以通过分区、分表、主从复制等方式进行扩展...

Global site tag (gtag.js) - Google Analytics