欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

高并发下的商城秒杀设计php+mysql+redis的实现

程序员文章站 2022-05-21 12:39:11
<?php/*高并发的秒杀设计php+mysql+redis* Author: lms <php7在qq.com> QQ:二一九二4238* 转发请注明来源网址http://www.thinkunion.nethttps://blog.csdn.net/weixin_43932088正常的操作:点击拍下,判断有没有库存,有则拍成功,然后减库存。但是,在高并发......
<?php
/*
高并发的秒杀设计
php+mysql+redis
* Author: lms <php7在qq.com> QQ:二一九二4238
* 转发请注明来源网址http://www.thinkunion.net
https://blog.csdn.net/weixin_43932088


正常的操作:点击拍下,判断有没有库存,有则拍成功,然后减库存。
但是,在高并发的情况下,判断库存的这个时间间隔,会出现多人同时进入这个门,
然后库存并没有减,导致拍出的结果超过库存。

那么我们利用redis的原子性操作即可以解决这个问题。
lpush,lpop,incr,decr这些.
这里我用decr直接减库存,返回减去的结果。如果小于0则表示没库存了拍完了。


假设100部手机参于秒杀
 */

\Redis::set('store',100); 

?>



<?php
/*--------点击抢购---------*/

$n=\Redis::decr('store');
if($n<0){
    echo '已经抢光了';
}

//数据库库存减一操作
//输出成功页面




/*
如果限定一个人只能抢一部手机
我们是不是要先判断这个人是不是已经拍了。
那我们假设这个人用了软件高并发一起拍,还是会有多个同时进入这个判断的可能性。

这时我们可以这样操作:
需要两个队列,一个是排队队列queueuser,一个是结果队列orderuser。
把人先放入队列中排队,然后系统自己做一个循环去叫号,然后操作判断、减库存、成功则加入结果队列等等。

那么有人会说,既然系统自己做一个循环去操作阻止并发,
那我们前面那个其实也可以这么设计,确实没错,原理都是一样。
*/

 

本文地址:https://blog.csdn.net/weixin_43932088/article/details/85983726