登录
  • 欢迎访问薛敬官方网站!每天分享技术和创业干货,与大家共同学习共同进步!!! QQ群
  • Git主题现已支持滚动公告栏功能,兼容其他浏览器,看到的就是咯,在后台最新消息那里用li标签添加即可。
  • 最新版xuejing主题已支持说说碎语功能,可像添加文章一样直接添加说说,新建说说页面即可,最后重新保存固定连接,演示地址
  • 百度口碑求点赞啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊http://koubei.baidu.com/s/googlo.xj
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏薛敬官网吧
  • 薛敬的淘宝店铺已经开张了哦,传送门:http://shop1111111.taobao.com

PHP+Redis+MySQL商品秒杀与超卖

php admin 134次浏览 0个评论 扫描二维码

如果你家店里某商品库存只有100件,现在店庆活动5折优惠大酬宾,假如现在有200个人疯狂涌入你家店里,为了避免发生疯抢和踩踏事件发生,店长您采取了排队限购的办法,1人限购1件,排队先到先买,卖完为止。下载源码

这个是实体店我们会看到的场景,100件商品,1人1件,最后200人中只有100人能买到商品,剩下100人只能空手而归。如果您开了家网店,同样你开起了秒杀的活动,可能同时会有1000人通过不同的终端访问你的商品秒杀活动页面,你的商品可以会在瞬间秒杀完毕,库存清零。可是如果网店秒杀活动程序设计出问题,会导致秒杀库存超卖的现象,比如100件库存,实际订单有120件,原因就处在并发同时程序处理的问题上。

其实我们也可以采取排队限购的办法解决网店秒杀活动商品超卖的问题。今天我们给大家讲解采用PHP+Redis+MySQL解决商品秒杀活动中超卖问题。

实现原理

把商品库存数量加到redis队列的num里,下单的时候通过rpop从队列中每次取1件商品,当num为0时,停止下单。

下面我们来看具体实现过程。

创建数据表

我们一共准备3张表,分别是:商品表、订单表、日志表。

1.商品表

我们在商品表中添加商品Apple iPhone 11,设置库存为100。

2.订单表

3.日志表

加入库存队列

我们在Redis中加入商品库存队列。由商品表中我们可知商品Apple iPhone 11库存有100件。我们可以写个脚本将商品库存加入到Redis队列中。

执行完成后,我们可以看到redis队列。

下单购买

我们建立下单文件Order.php

首先是连接redis和mysql的代码。

接着就是抢购下单。我们从商品可以中取出商品信息,然后从redis队列num中rpop出列一个商品数,接着马上处理商品购买的过程。

上述代码中,如果redis队列数量变成0了,就是没有库存了,这个时候不做订单处理了,如果不是0就要更新库存,生成订单。

在下单过程中,我们采用了MySQL的事物机制,每次当订单表中写入订单数据并且商品表扣除库存-1成功,才算下单完成。

最后附上生产订单号的代码,以及日志记录代码。

调用下单代码:

详细代码请点击文章上部的下载按钮,移动版用户不提供下载。

并发测试

我们Apache的ab测试,ab是apachebench命令的缩写,是Apache自带的压力测试工具,假如你安装了Apache软件后,在他的bin目录下可以找到ab这个程序。

保证你的order.php在你的站点能访问到,然后启动ab测试,输入以下命令:

(-n发出1000个请求,-c模拟200并发,请求数要大于或等于并发数。相当1000人同时访问,后面是测试url )。

执行结果如图:

验证结果

分别查看商品表hw_goods,检验库存字段inventory是否由100变成0了。

查看订单表hw_order,查询该商品的订单总数是否为100。

查看日志表hw_order_log,查询状态status为1的订单日志记录是否是100条,其余的状态均为0。

经验证,库存为0,订单总数为100,并没有出现超卖的现象。

打赏

薛敬官网 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明PHP+Redis+MySQL商品秒杀与超卖
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址