一、单机版
模拟秒杀伪代码
$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'); //库存-1
if ($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 = <<<EOF
if redis.call("get",KEYS[1]) == ARGV[1]
then
return redis.call("del",KEYS[1])
else
return 0
end
EOF;
$res = Redis::eval($luaScript, 1, $lockKey, $user_id);
}
}
DB::commit();
return '抢购成功!';
} catch (\Exception $exception) {
DB::rollBack();
return '请稍后重试!';
}
}
echo "请稍后重试!";