對於秒殺平台的購物車設計來講,效能是乙個設計目標。
秒殺模式流量一般體現在某個時間段開搶的時候,這就意味著在這個峰值時間會有大量操作購物車的操作,並且對乙個熱點sku會有大量的訪問操作。
因此設計時,可以將購物車資料及對就sku庫存放入快取中。這樣可以提公升效能,但會存在丟失資料的危險。這就需要有機制當快取掛掉時,重啟時候,使用者購物車在快取中的資料不會沒掉。這個快取可以用redis,主備結構,主結點負責寫,讀操作操作,從結點作為冷備。當快取主結點掛掉時或者更嚴重的是主結點機子磁碟損壞,這樣可以從備份結點恢復資料。
因為sku庫存放入快取中後,與資料庫中的sku庫存會有一致性問題。具體來講會有快取中sku庫存大於資料庫中sku庫存,這時就會發生超賣。而如果快取中的sku庫存小於資料庫中sku庫存,這時就會發生少賣。
超賣的情況在小概率情況下,如果不對加庫存操作做冪等性,這個就不可避免,即當由於業務中對某個sku加庫存dubbo操作重**送,導致快取中的庫存被多加了n個。這樣在之後這多出的n個庫存被使用者放入購物車,最終下單時,由於實際資料庫庫存只有m個,因此導致擁有這個n個多出庫存的使用者操作是失敗的。
而如果對庫存操作做冪等操作,意味著庫存增加操作dubbo服務提供方需要保證冪等性。一般的做法是服務呼叫方生成乙個唯一流水號,然後將此流水放入redis快取,並在呼叫服務提供方時將此流水號帶上。然後加庫存服務提供方在接收到此流水號時,先嘗試從快取中delete,如果有資料且清除成功且執行加庫存操作。
由此可見對於庫存操作做冪等性來講,會增加兩次對於快取的操作。
而如果不做冪等的話,就會發生超賣,當然對於這種情況可以選擇告訴使用者[您手慢了,此商品已被搶光]。
而之前網易專案使用不做冪等,最終提供使用者的方案,解決超賣問題。
而對於少賣,即快取中sku庫存小於資料庫中庫存,這一般會發生在併發時,多個使用者搶一件商品sku時,導致庫存變成負數,而之後回滾庫存操作可能失敗。這就導致少賣的情況。對於這種情況一種解決方案是每天凌晨2點同步一次快取庫存與資料庫庫存。
對於購物車涉及到的業務介面,基本有以下幾個:
1.addtocart(long userid,long skuid,int count); //加入sku到購物車接品
2.updateamount(long userid,skuid,int differ,listselectedskuids); //將使用者購物車中某個sku的數量增加或減去differ值。此方法更新商品後,會根據selectedskuids重新計算一遍購物車**,返回滿足條件的優惠券
3.deletecart(long userid,long skuid, listselectedskuids); //將某個sku從使用者購物車移除。此接品,在清除後台會重複計算selectedskuids**,並會返回選中的sku列表與未選中的sku列表集合。及相應優惠券。
4.getcart(long userid,listselectedskuids); //查詢使用者購物車。此接品會重新計算selectedskuids,並返回選中與未選中sku列表集合,返回相應的滿足條件的優惠券資訊。
5.doselectcart(long userid, listselectedskuids); //使用者在選中或取消購物車中某個sku項時,呼叫此方法。會重複計算選中列表,並返回計算後選中與未選中列表,及相應符合條件的優惠券資訊。
購物車設計
購物車設計 最近接觸了下購物車,發現購物車裡面的內容還是比較繁瑣的,乙個合理的設計實在是必不可少的,所以查了下資料,也結合自己的一些理解,小小總結了下 補充一點 好的資料庫表設計是任何實現的基礎 1.什麼是購物車?實物 去超市看看,簡單理解為能裝貨物的推車 購物籃 網際網路 虛擬購物車,存放虛擬貨品...
購物車(註冊 登入 購物 購物車 結帳)
購物車 註冊 登入 購物 購物車 結帳 shopping car dict dict money 0 def input username pwd username input username pwd input pwd return username,pwd def goods get with...
購物車設計的總結
文 先小龍 根據調查,2016 年全球購物車放棄率在75 左右,這個數字恐怕比我們想象中的高了很多。而導致這個的原因其中包括 接下來,慢慢剖析一下乙個合格的購物車的基本設計。目錄 1 購物車的作用 2 購物車的入口設計 3 立即結算和加入購物車的區別 4 加入購物車的前置流程 5 購物車系統與其他系...