下單限購邏輯

①初始化限購配置:限購方式配置畅铭,比如按用戶id菠隆,客戶端ip兵琳,收貨人電話號等,配置限購時長骇径,限購件數(shù)等;

        self::$_cache_strategy_config = [
            "ip" => ["time" => 86400 * 15, "limit" => 1],
            "user_id" => ["time" => 86400 * 15, "limit" => 1],
            "delivery_mobilephone" => ["time" => 86400 * 15, "limit" => 1],
            "imei" => ["time" => 86400 * 15, "limit" => 1],
        ];

然后是活動類型的限購躯肌,比如秒殺活動的商品限購1件,搶購活動的商品限購5件等破衔。

self::$_cache_strategy_config_factor = [
    "MS" => [
        "ip" => 10,
        "user_id" => 1,
        "delivery_mobilephone" => 1,
    ],
    "QG" => [
        "ip" => 10,
        "user_id" => 1,
        "delivery_mobilephone" => 1,
    ],
];

②設(shè)置限購商品數(shù)據(jù)內(nèi)容清女,根據(jù)查詢出來的商品信息,以及對應(yīng)的活動信息進(jìn)行判斷晰筛。
1.處于活動中的商品判斷限購嫡丙,業(yè)務(wù)里根據(jù)商品或者活動層面的字段標(biāo)識區(qū)分拴袭,例如秒殺活動,限時搶購曙博,付郵試用等這些判斷出是需要限購的商品拥刻,然后檢驗一下用戶當(dāng)前購買件數(shù)是否超過指定值,作出異常處理父泳。
這里先判斷單sku是否超標(biāo)泰佳,然后判斷多sku和是否超標(biāo),這里需要在商品層面將spu商品標(biāo)記出來尘吗,

        if(isset(self::$checkProduct[$product['product_id']])){
            self::$checkProduct[$product['product_id']] += $product['count'];
        } else {
            self::$checkProduct[$product['product_id']] = $product['count'];                    
        }

符合的則記錄限購商品的相關(guān)信息逝她,供后續(xù)redis使用。

self::$productActivityBuyCountArr[$product['product_id'] . '_' . $product['sku_id']] = $product['count'];//當(dāng)前sku的購買數(shù)量
$autoCacheInfo['tmp_limit_count'] = $activityLimitCount;
self::$productActivityTypeArr[$product['product_id'] . '_' . $product['sku_id']] = $autoCacheInfo; //限購商品信息

③商品檢驗完后睬捶,開始檢查用戶是否購買過黔宛,即判斷是否超過已購買的限購次數(shù),在redis存儲數(shù)據(jù)進(jìn)行判斷和儲存擒贸。
1.一種商品可能會陸續(xù)報名多個活動類型的限購臀晃,因此redis存儲時標(biāo)識的key應(yīng)該區(qū)分開來,例如

$key = $value['productId'] . '_' . $value['activityId'];
$cacheKey = $keyword . $keyword_val . '_' . $key; 
// user_id13432_7654_533或ip127.0.0.1_13432_533或phone15901438107_13432_533

2.根據(jù)對應(yīng)的緩存key介劫,incr指定的商品購買數(shù)量徽惋,并設(shè)置過期時間。然后檢驗incr后的結(jié)果與該商品限購數(shù)量進(jìn)行比較座韵,如果超過限購數(shù)量险绘,則需要還原之前購買的次數(shù)的緩存,即將對應(yīng)商品購買的數(shù)量還原減回去。

if (!empty(self::$_decr_key)) {
    foreach (self::$_decr_key as $decrKey) {
        CacheSDK::RedisDefault()->delBuyActivityProductRecord($decrKey, self::$_count);
        if (isset(self::$_ActivityLimitItems[$productId][$decrKey])) {//回滾的時候去掉限制策略數(shù)據(jù)
            unset(self::$_ActivityLimitItems[$productId][$decrKey]);
        }
    }
}
CacheSDK::RedisDefault()->delBuyActivityProductRecord($cheatKey, self::$_count);
//回滾的時候去掉限制策略數(shù)據(jù)
if (isset(self::$_ActivityLimitItems[$productId][$cheatKey])) {//回滾的時候去掉限制策略數(shù)據(jù)
    unset(self::$_ActivityLimitItems[$productId][$cheatKey]);
}

(這塊也是個bug誉碴,對于單商品多sku的購買宦棺,這里decrKey只會覆蓋上一個,應(yīng)該用```self::_ActivityLimitItems[productId][cacheKey]```來獲得相應(yīng)的緩存key和對應(yīng)商品spu的總數(shù)量黔帕,不用管self::$_decr_key )
如果可以購買代咸,則記錄當(dāng)前商品的限購信息

private static $_decr_key = array(); //每次購買策略次數(shù)增加的key
array_push(self::$_decr_key, $cacheKey);
self::$_ActivityLimitItems[$productId][$cacheKey] = self::$_count; //添加被限制的策略數(shù)據(jù),self::$_count為當(dāng)前購買的數(shù)量才對

(這塊應(yīng)該是個bug,同一商品買多個sku情況下成黄,商品數(shù)量應(yīng)該累加的)

if(isset(self::$_ActivityLimitItems[$productId][$cacheKey])){
     self::$_ActivityLimitItems[$productId][$cacheKey] += self::$_count;
 }

④其他情況的失敗呐芥,例如下單失敗或者某個服務(wù)掛掉,用戶取消訂單等情況奋岁,之前限購的數(shù)據(jù)應(yīng)該回滾思瘟,同樣走上面的回滾邏輯,數(shù)據(jù)也是之前限購的數(shù)據(jù)內(nèi)容(self::$productActivityTypeArr厦取,做到按sku維度存儲信息潮太,然后按spu維度去統(tǒng)計限購,也就是循環(huán)多次想加的邏輯);取消訂單的話铡买,數(shù)據(jù)需要根據(jù)訂單重新查詢更鲁,然后拼接去redis中回滾。
⑤下單購買超出限購奇钞,拋出異常澡为,提示已購買數(shù)量和限購總數(shù),即還可以購買幾件或者已購買完限購量景埃。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末媒至,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谷徙,更是在濱河造成了極大的恐慌拒啰,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件完慧,死亡現(xiàn)場離奇詭異谋旦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)屈尼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門册着,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脾歧,你說我怎么就攤上這事甲捏。” “怎么了鞭执?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵司顿,是天一觀的道長。 經(jīng)常有香客問我蚕冬,道長免猾,這世上最難降的妖魔是什么是辕? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任囤热,我火速辦了婚禮,結(jié)果婚禮上获三,老公的妹妹穿的比我還像新娘旁蔼。我一直安慰自己,他們只是感情好疙教,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布棺聊。 她就那樣靜靜地躺著,像睡著了一般贞谓。 火紅的嫁衣襯著肌膚如雪限佩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音祟同,去河邊找鬼作喘。 笑死,一個胖子當(dāng)著我的面吹牛晕城,可吹牛的內(nèi)容都是我干的泞坦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼砖顷,長吁一口氣:“原來是場噩夢啊……” “哼贰锁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起滤蝠,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤豌熄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后物咳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體房轿,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年所森,在試婚紗的時候發(fā)現(xiàn)自己被綠了囱持。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡焕济,死狀恐怖纷妆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晴弃,我是刑警寧澤掩幢,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站上鞠,受9級特大地震影響际邻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芍阎,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一世曾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谴咸,春花似錦轮听、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至珊随,卻和暖如春述寡,著一層夾襖步出監(jiān)牢的瞬間柿隙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工鲫凶, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留优俘,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓掀序,卻偏偏與公主長得像帆焕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子不恭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容