一、单机版
模拟秒杀伪代码
$group_id = 21;$user_id = uniqid();$lockKey = 'lock:user_id_' . $user_id;$resultKey = 'res:group_id_' . $group_id;$info = Redis::get($resultKey);if (!is_null($info) && $info <= 0) {return "秒杀结束!";}$lock = Redis::set($lockKey, $user_id, 'PX', 10000, 'NX');if ($lock) {DB::beginTransaction();try {$res = DB::table('group')->where('id', $group_id)->where('days', '>', 0)->decrement('days'); //库存-1if ($res) {$info = DB::table('group')->where('id', $group_id)->value('days'); //商品剩余个数$res = DB::table('notify_log')->insert(['log' => '用户id:' . $user_id . '抢购成功,商品剩余' . $info . '个']); //插入日志(订单)if ($res) {Redis::set($resultKey, $info);//释放锁$luaScript = <<<EOFif redis.call("get",KEYS[1]) == ARGV[1]thenreturn redis.call("del",KEYS[1])elsereturn 0endEOF;$res = Redis::eval($luaScript, 1, $lockKey, $user_id);}}DB::commit();return '抢购成功!';} catch (\Exception $exception) {DB::rollBack();return '请稍后重试!';}}echo "请稍后重试!";
