网站秒杀解决思路

原理就是买的时候不排队支付的时候排队

如何制造库存为负,  

用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'));
   }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值