最近在做一个团购项目,遇到个问题,就是在抢购、秒杀、抽奖等活动时,库存数量有限,但是同时下单人数超过了库存数量,就会导致商品超售问题。那么我们怎么来解决这个问题呢,我的思路如下:
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高并发解决方案
这个是很好解决高并发的一个方案,大家可以下载来看看,一同进步
一、高并发的概念 在互联网时代,并发,高并发通常是指并发访问。也就是在某个时间点,有多少个访问同时到来。 二、高并发架构相关概念 1、QPS (每秒查询率) : 每秒钟请求或者查询的数量,在互联网领域,指每秒响应...
面试题高并发和大流量解决方案篇
本文讲的是mysql大数据分库和分表 php解决方案。 mysql分库分表方案、mysql 分库方案、php实现mysql分库分表、mysql高并发解决方案。
主要介绍了PHP+Redis链表解决高并发下商品超卖问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少(”超卖”问题) 对于第一个问题,已经很容易想到用缓存来处理抢购,避免直接操作数据库,例如使用Redis。 重点在于第二个问题 常规写法: 查询出...
redis锁处理高并发问题十分常见,下面这篇文章主要给大家介绍了关于如何使用Redis锁解决高并发问题的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
主要提供解决方案和代码功能。运用了redis,innodb,事务处理。
利用redis的高性能和事务特性来解决线上优惠券被超库存抢购的问题,下面我给出我临时解决这个问题的第一版的伪代码,去掉了一些细节: /** * 抢优惠券(秒杀) * @param int $couponId 商品ID * @param
本文实例讲述了PHP商品秒杀问题解决方案。分享给大家供大家参考,具体如下: 引言 假设num是存储在数据库中的字段,保存了被秒杀产品的剩余数量。 if($num > 0){ //用户抢购成功,记录用户信息 $num--; } 假设在...
超级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 镜像...
上次研究了雪花算法,虽然不错,但是感觉限制太多了,而且也比较复杂,要是本地用wamp一类的来测试还容易出问题,所以找了一种更加简便的方法,PHP的uniqid函数,很方便实用,也很简单,就是一行代码就解决了,网上...
在这里提供4种高并发读写文件的方案,各有优点,可以根据自己的情况解决php并发读写文件冲突的问题。
使用BitmapFactory加载图片时,如果图片过大可能引起OutOfmemory溢出的问题。解决办法。
无论是处理大规模数据集还是高并发请求,该项目都能够保持优秀的性能表现。 灵活的扩展性:MySQL具有良好的扩展性,可以轻松地扩展到更大的数据集和更高的负载。该项目可以通过分区、分表、主从复制等方式进行扩展...