一、點擊搶購
前臺頁面,用戶點擊搶購,後臺需要執行的操作
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返回微信支付所需要的數據格式