涉及搶購、秒殺、抽獎、搶票等活動時,為了避免超賣,那麼庫存數量是有限的,但是如果同時下單人數超過了庫存數量,就會導致商品超賣問題。那麼我們怎麼來解決這個問題呢?
採用樂觀鎖,使用redis實現
<?php
header("content-type:text/html;charset=utf-8");
$redis = new redis();
$result = $redis->connect(`127.0.0.1`, 7379);
$redis->watch("mywatchlist");
$len = $redis->hlen("mywatchlist");
$rob_total = 100; //搶購數量
if ($len < $rob_total) {
$redis->multi();
$redis->hSet("mywatchlist", "user_id_" . mt_rand(1, 999999), time());
$rob_result = $redis->exec();
file_put_contents("log.txt", $len . PHP_EOL, FILE_APPEND);
if ($rob_result) {
$mywatchlist = $redis->hGetAll("mywatchlist");
echo `搶購成功` . PHP_EOL;
echo `剩餘數量:` . ($rob_total - $len - 1) . PHP_EOL;
echo `使用者列表:` . PHP_EOL;
print_r($mywatchlist);
exit;
} else {
exit(`手氣不好,再搶購!`);
}
} else {
exit(`已賣光`);
}