您的位置:首页 > 数据库 > Redis

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

2019-01-07 08:59 232 查看
版权声明:http://www.thinkunion.net https://blog.csdn.net/weixin_43932088/article/details/85983726
[code]<?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。
把人先放入队列中排队,然后系统自己做一个循环去叫号,然后操作判断、减库存、成功则加入结果队列等等。

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

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: