原理就是买的时候不排队支付的时候排队
如何制造库存为负,
用ab.exe 压力测试工具,sleep(2)先让所有人在外面站着然后在一起进去,让每个人拿到的商品都一样库存都一样,一起去执行减操作。就会造成库存为负。
如果是小型项目,就利用文件锁
首先让它们拿到的库存都一样
然后让它们排队
1.打开文件
2.文件上锁
3.执行操作,让它们一个一个执行减操作
4.文件解锁
/ / 防止秒杀库存为负 public function flock(){ $num = Db::name('goods')->where(['id'=>16])->value('goods_num'); // $file = "temp.txt"; // $fp = fopen($file , 'w'); sleep(2); // flock($fp , LOCK_EX); if($num>0){ $num = Db::name('goods')->where(['id'=>16])->update(['goods_num'=>$num-1]); } // fclose($fp); }
如果是大型项目,就利用redis,列表,
1.先把秒杀的东西存在入redis列表
2.每次取的时候从redis中取
3.redis当中的数据与数据库中的统一
public function seckill(){ $num = Db::name('goods')->where(['id' => 16])->value('goods_num'); if($num>0){ $redis = new \Redis(); $redis->connect('127.0.0.1'); $redis->lPushx('商品'.$num,$num); Db::name('goods')->where(['id' => 16])->update(['goods_num'=>$num-1]); halt( $num = Db::name('goods')->where(['id' => 16])->value('goods_num')); }