在电子商务发达的今天,各种秒杀,抢购活动的场景不少,如何解决高并发下出现的订单超发情况呢?
在常规情况下,我们会根据用户提交的请求去查询商品库存,如果库存小于0则订单生成失败。但是这种情况下经常了订单需要的数量超过了库存数量,即出现负库存。
先讨论常规场景测试:
我们在redis中设置一个库存表,就是个简单的string类型, 用以标示库存即可。
set inventory 100
使用多进程测试如下:因为我的AB测试不能用。所以使用多进程的方式进行
//register a signal
pcntl_signal(SIGCHLD, SIG_IGN);
$times = 200;
while ($times-- > 0) {
$pid = pcntl_fork();
if ($pid > 0) {
} else {
order();
die;
}
}
sleep(20);
function order() {
$conn = new Redis;
//connect redis
$conn->connect("127.0.0.1", 6379);
$inventory = $conn->get('inventory');
//由于本地服务过访问过快。所以休息50毫秒真实模拟高并发
usleep(50000);
if ($inventory > 0) {
$conn->decr("inventory");
} else {
echo "抢购失败&#