方案主要分成2个层
- 上游层
- 服务层
上游层
具体做法:
- 当秒杀还没开始的时候,我们可以禁止抢购按钮不能点击
- 开始抢购开始后,这里可以设计用户点击后就禁止点击了,这样可以避免用户再重复点击,造成很大的压力。
服务层
- 服务层面主要是减少数据库压力,所有请求都放进redis的队列里面,超出数量范围的都直接返回告知用户已抢购完。
- 对于用应用程序跑的抢购,这个我们也用些每分钟请求接口数量来控制,毕竟是极少一部分人才会这样做
关于redis实现数量商品数量减少和加入到队列里面具体实现:
$num = $this->redis->get('num');
if($num > 0) {
$this->redis->watch('num');
usleep(100);
$res = $this->redis->multi()->decr('num')->lPush('result',$num)->exec();
if($res == false){
echo "fail1";
}else{
echo "success:".$num;
}
}else{
echo "fail2";
}
这里的watch其实跟mysql的乐观锁的实现原理差不多