高并发下的商城秒杀设计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
上一篇: MySQL的varchar类型字段
下一篇: SQL5---条件查询