使用redis watch實現秒殺搶購,避免超賣

小勇發表於2017-04-27

涉及搶購、秒殺、抽獎、搶票等活動時,為了避免超賣,那麼庫存數量是有限的,但是如果同時下單人數超過了庫存數量,就會導致商品超賣問題。那麼我們怎麼來解決這個問題呢?

採用樂觀鎖,使用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(`已賣光`);
}

相關文章