Redis实现秒杀,我想大部分口试电商公司都会问到的问题,大部分常规做法是先查询库存是否还存在,存在插入订单,减掉库存,没有库存就下单失落败,高并发情形下,会涌现超卖,有的人说了,我可以用数据库事务加锁掌握,办法是没问题,但是在高并发下效率低下,以是才有了借用Redis实现高并发下库存担保精确,下面我们讲下实现思路。
1.首先该当是2个行列步队,一个放初始化的库存行列步队,一个放抢购的用户行列步队用来判断此用户是否已经抢购,如果是多个商品则可以把用户行列步队的值把商品ID和用户ID一起存进去,下面是详细的PHP实当代码:
库存初始化$num=10; //库存 $len=\Redis::llen('goods_store:1'); //检讨库存,goods_store:1 定义为健名 $count = $num-$len; //实际库存-被抢购的库存 = 剩余可用库存 for($i=0;$i<$count;$i++) \Redis::lpush('goods_store:1',1);//往goods_store列表中,未抢购之前这里该当是默认滴push10个库存数了抢购代码
$user_id = \Session::get('user_id');//当前抢购用户id/ 仿照抢购操作,抢购前判断redis行列步队库存量 /$count=\Redis::lpop('goods_store:1');if(!$count) return '已经抢光了哦';$result = \Redis::lpush('order:1',$user_id);if($result) return '恭喜您!抢到了哦';
上面只是大略仿照高并发下的抢购思路,真实场景要比这繁芜很多,比如双11活动远远比这更繁芜多啦,比如要判断用户是否已经抢购这个商品了,就须要加一个排队的行列步队,来的人都来排队,思路:须要一个排队行列步队(比如:queue:1,以user_id为值的列表)和抢购结果行列步队(比如:order:1,以user_id为值的列表)及库存行列步队(比如上面的goods_store:1)。高并发情形,先将用户进入排队行列步队,用一个线程循环处理从排队行列步队取出一个用户,判断用户是否已在抢购结果行列步队,如果在则已抢购,否则未抢购,接着根据抢购结果行列步队异步来处理库存和订单。