鍍金池/ 問答/人工智能  PHP  網(wǎng)絡(luò)安全/ 基于php和redis如何設(shè)計一個秒殺系統(tǒng)?

基于php和redis如何設(shè)計一個秒殺系統(tǒng)?

基于php和redis如何設(shè)計一個秒殺系統(tǒng)?

大概的要求是:能處理高并發(fā)請求,搶購成功但是在規(guī)定時間內(nèi)未支付的訂單需要從新回到系統(tǒng)。

回答
編輯回答
厭惡我

Redis有一個list的數(shù)據(jù)結(jié)構(gòu)可以滿足你的需求,詳情可以看一下慕課網(wǎng)的教程高峰削流

2018年2月9日 00:14
編輯回答
荒城

我自己想一個大概思路:分為兩部分 1.先由Api隨機(jī)踢掉一部分用戶,讓少部分流量打到后段業(yè)務(wù);2.由于秒殺,所以必須要要控制超賣,建議使用Redis隊(duì)列預(yù)先把商品寫入隊(duì)列中,到點(diǎn)使用key去pop,如果pop出有,則視為搶到,這樣可以防止超賣。長期未為購買的用戶,可以使用cron來跑,或者把生成的訂單號,放到redis里面去,結(jié)算的時候踢掉,然后使用cron進(jìn)行輔助。或者可以使用beanstalk,延時任務(wù)隊(duì)列。最好都還是用cron來輔助。大概思路就這樣。

2017年7月16日 05:35
編輯回答
獨(dú)白

秒殺可以考慮使用redis隊(duì)列來實(shí)現(xiàn)。

對于30分鐘未支付的訂單有兩種方案可考慮:

第一種方案:被動過期+cron,就是用戶查看的時候去數(shù)據(jù)庫查有沒有支付+定時清理。
第二種方案:延遲性任務(wù),到時間檢查訂單是否支付成功,如果沒有支付則取消訂單。

2018年1月16日 02:56
編輯回答
練命
<?php
$redis = new redis();
$result = $redis->connect('127.0.0.1', 6379);
$mywatchkey = $redis->get("mywatchkey");
$rob_total = 100;   //搶購數(shù)量
if($mywatchkey<$rob_total){
    $redis->watch("mywatchkey");
    $redis->multi();
    
    //設(shè)置延遲,方便測試效果。
    sleep(5);
    //插入搶購數(shù)據(jù)
    $redis->hSet("mywatchlist","user_id_".mt_rand(1, 9999),time());
    $redis->set("mywatchkey",$mywatchkey+1);
    $rob_result = $redis->exec();
    if($rob_result){
        $mywatchlist = $redis->hGetAll("mywatchlist");
        echo "搶購成功!<br/>";
        echo "剩余數(shù)量:".($rob_total-$mywatchkey-1)."<br/>";
        echo "用戶列表:<pre>";
        var_dump($mywatchlist);
    }else{
        echo "手氣不好,再搶購!";exit;
    }
}
?>
2017年6月7日 02:12