🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
抢购、秒杀、抽奖、抢票等一般都会出现以下问题 1、对现有网站业务造成冲击,秒杀活动只是网站营销的一个附加活动,这个活动具有时间短,并发访问量大的特点,如果和网站原有应用部署在一起,必然会对现有业务造成冲击,稍有不慎可能导致整个网站瘫痪。 > 解决方案:将秒杀系统独立部署,甚至使用独立域名,使其与网站完全隔离。 2、用户在秒杀开始前,通过不停刷新页面以保证不会错过秒杀,这些请求如果按照一般的网站应用架构,访问应用服务器、连接数据库,会对应用服务器和数据库服务器造成负载压力。 > 解决方案:重新设计秒杀商品页面,不使用网站原来的商品详细页面,商品相关数据使用缓存,商品页面内容静态化 3、假设商品页面大小200K(主要是商品图片大小),那么需要的网络和服务器带宽是2G(200K×10000),这些网络带宽是因为秒杀活动新增的,超过网站平时使用的带宽。 > 解决方案:因为秒杀新增的网络带宽,必须和运营商重新购买或者租借。为了减轻网站服务器的压力,需要将秒杀商品页面缓存在CDN,同样需要和CDN服务商临时租借新增的出口带宽。 > 4、超卖现象,库存数量是有限的,如果同时下单人数超过了库存数量,就会导致商品超卖问题 解决方案: 要解决“超抢/超卖”的问题,核心在于保证检查库存时的操作是依次执行的,也就是串行的,即使有很多用户同时到达,也是一个个检查并给与抢购资格,一旦库存抢尽,后面的用户就无法继续了。 ~~~ //下面是伪代码 //开抢前redis设置商品总库存list列表 for($i=0;$i<$goods_store;$i++)   \Redis::lpush('goods_store',1); //开启秒杀 $user_id = \Session::get('user_id');//当前抢购用户id $count=\Redis::lpop('goods_store');// 移出并获取列表的第一个元素 相当于商品总库存减去1 这里是原子性操作 不存在并发问题 if(!$count)   return '已经抢光了哦'; $result = \Redis::lpush('order:1',$user_id);// 记录抢购成功信息 if($result)   返回给前端 抢购成功 然后跳转另一个页面下单处理 ~~~ ![](https://box.kancloud.cn/8ba00c8ecd7eef1e8d65a1f667a96091_569x658.png) 文章来源: https://www.cnblogs.com/andy-zhou/p/5364136.html https://www.cnblogs.com/phpper/p/7085663.html https://mp.weixin.qq.com/s?__biz=MjM5NDM4MDIwNw==&mid=2448834705&idx=1&sn=25cf3d4f6d6826e564a634901189eb8f