高并发产生的问题:
1、超卖:比如A商品库存是10个,在同一时间有100个用户去抢购这个商品,这个时候去判断库存是否充足,答案肯定是充足的。造成的问题就是会多卖了90个。
2、超抢:一般秒杀是一个用户只能抢一次。如果某平台没有对用户唯一性做限制,就是说在不同的设备上都可以登录这个平台,然后同时去抢这个商品,就会造成这个商品被同一个用户抢了多次。
redis优势:
1、redis队列方法:因为redis队列可以实现及时多个用户同时去请求,也会按顺序排列起来。是一种单线程模式。
2、redis哈希方法:hash可以根据用户id存储用户信息,并且每个用户id只存储一次。用来实现超抢问题。
解决方法:
1、提前将抢购商品存到redis队列中。
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);//商品A总库存量
A商品id:$goods_id;
库存:$num = 10;
for($i=0;$i<10;$i++){
$redis->rpush('goods_store:'.$goods_id,1);
}
这个步骤可以放到秒杀开始前,比如写个定时去执行这个脚本,将所有秒杀商品库存都放到redis队列中
2、秒杀活动开始,用户开始抢购商品
$goods_id;//商品id
$user_id;//当前抢购用户id
$wait_key