搶購基本思路(僅供參考)

一、點擊搶購

前臺頁面,用戶點擊搶購,後臺需要執行的操作

1、幾個Redis緩存

  • 活動商品剩餘數量緩存:redis->get(),redis->set()
  • 已搶隊列緩存:redis->hGet(),redis->hSet()
  • 待搶隊列緩存:redis->hGet(),redis->hSet()

2、一個Redis入棧

  • redis->rPush()

3、詳細流程

  • 接收參數(活動商品ID,搶購商品數量)
  • 獲取當前登錄用戶信息(根據Redis緩存)
  • 判斷活動是否結束
  • 判斷活動商品是否存在
  • 根據緩存判斷商品剩餘數量。如果是第一次進來,存一下剩餘數量 = 活動商品總數量 - 已搶數量
    • 商品剩餘數量不足
    • 非常抱歉,商品已搶光
  • 判斷用戶是否在已搶隊列,如果在,提示用戶:您不能重複搶購
  • 判斷用戶是否在待搶隊列,如果在,提示用戶:您已經搶過了
  • 把用戶信息redis->rPush()入棧
    • 入棧數據 $data = json_encode($data, JSON_UNESCAPED_UNICODE); //存json字符串
    • 入棧成功,加入待搶隊列
  • 剩餘剩餘數量減去用戶搶購商品數量:redis->decrBy()

二、生成訂單數據

redis->blPop()獲取入隊的數據

  • 代碼示例
public function createOrder(){
    while (true){
        $data = $redis->blPop($joinKey, 10);
        if ($data){
            $info = json_decode($data[1], true);

            self::processData($info, ..., ...);
        }/*else{
            echo '等待中...' . date('Y-m-d H:i:s') . PHP_EOL;
        }*/
    }
}

public function processData($info, $LogDao, ...){
    try{
        Db::startTrans();

        //獲取redis->blPop()數據
        $uid = $info['uid'];

        //記錄日誌
        $logData = [
            'status' => 1,  //正常
                    ...
        ];

        //數據處理

        Db::commit();

        BaseRedis::hSet($rushKey, $uid, true);    //設置已搶隊列
        BaseRedis::hDel($waitKet, $uid);                //刪除待搶隊列
    }catch(\Exception $e){
        $logData['remark'] = 'Error:' . $e->getFile() . '(' . $e->getLine() . ') ' . $e->getMessage();
        $logData['status'] = 2; //異常
        Db::rollback();         //數據庫回滾
    }

    $LogDao->insert($logData);  //添加日誌信息
}

三、支付操作

用戶點擊支付,更新訂單信息,調用微信支付SDK返回微信支付所需要的數據格式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章