淺談電商業務邏輯

因爲之前做的項目 電商的居多,這裏有一些小的心得記錄一下,都是一些業務邏輯處理

**

·商城抽獎:

**
量小的活動可以採取PHP+MySQL來實現
數量大併發高依舊可以選擇redis

必要條件:活動獎品類型(有多少),每種獎品的中獎概率,用戶
活動是否處於抽獎活動
活動的開始結束時間
用戶是否已經抽獎
獎品列表信息
查詢當前抽中的獎品 是否有餘量,如果沒有則替換其他獎品,其他也沒有,顯示獎品或者活動結束
有獎品時,更改數據庫,給用戶發送短信

抽獎算法的思路呢,這個比較簡單
將概率放在一個數組裏
計算概率的總和
循環這個數組,從總概率中取一個整數
比較這個數,小於等於概率,直接返回
否則給這個數重新定義
再次比較

商城秒殺

要解決兩個問題
1、高併發對數據庫產生的壓力
2、超賣問題
第一個就是用緩存來解決,第二個問題 與上面問題處理相似,採用redis隊列,採用多個隊列共同完成,排隊隊列,搶購結果隊列,庫存隊列,高併發的情況下,把用戶放入排隊隊列,循環處理排隊隊列,判斷用戶是否在搶購結果隊列,在的話就是已搶購,否則未搶購,庫存-1,把用戶放入搶購結果隊列

還有一種方式:
1、先做一個靜態頁面
2、先到的用戶存在一個數組裏也可以是緩存,後面剩下的都去訪問靜態頁面,這麼做壓力更小,不推薦

商品超賣問題

第一種方案:下訂單前判斷促銷商品的數量夠不夠,不夠不允許下訂單,更改庫存量時加上一個條件,只更改商品庫存大於0的商品的庫存,壓測還是會出現超賣的情況,否決。

第二種方案:mysql的事務加排他鎖來解決,存儲引擎爲innoDB,使用的是排他鎖實現的,剛開始的時候我們測試了下共享鎖,發現還是會出現超賣的現象。高併發測試,對數據庫的性能影響很大,導致數據庫的壓力很大

第三種方案:使用文件鎖實現。當用戶搶到一件促銷商品後先觸發文件鎖,防止其他用戶進入,該用戶搶到促銷品後再解開文件鎖,放其他用戶進行操作。這樣可以解決超賣的問題,但是會導致文件得I/O開銷很大

第四種方案:redis的隊列,將要促銷的商品數量以隊列的方式存入redis中,每當用戶搶到一件促銷商品則從隊列中刪除一個數據,確保商品不會超賣。這個操作起來很方便,而且效率高。

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