老师,不光有超卖问题,还有超买问题。
超卖问题
用了课程的 Redis 方案来做秒杀,经过测试出现了超卖。
最终这样修改,经过几次测试没有出现超卖。
app/Services/OrderService.php
use Illuminate\Support\Facades\Redis;
.
.
.
public function seckill(User $user, array $addressData, ProductSku $sku)
$order = \DB::transaction(function () use ($user, $addressData, $sku) {
// 直接先扣减 Redis 中的值,通过返回值判断库存
if (Redis::decr('seckill_sku_'.$sku->id) < 0) {
throw new InvalidRequestException('该商品库存不足');
}
.
.
.
// Redis::decr('seckill_sku_'.$sku->id);
return $order;
});
.
.
.
}
.
.
.
超买问题
登录到管理后台,将秒杀商品的 SKU 库存改为 20 的时候。总共 10 个用户,经过测试,有几个用户下了不止 1 单;也就是说 10 个用户下了 10 多单。
问题出在同一个用户并发请求过高,导致多下单。正常情况谁会同一时间点击那么高的次数下单。
解决问题思路:在秒杀下单逻辑的事务里加上 用户已经下单了该商品
的判断。