購物車系統的設計
在電商平臺中,購物車是一個非常核心的功能,用戶瀏覽商品的過程中,他們可以將感興趣的商品加入購物車方便后面挑選和下單。購物車功能的設計對于提升用戶體驗、增加公司商品銷售量都有重要影響。
圖片
上圖是一個典型的電商購物車的圖,購物車協助用戶選購商品時提供如下的功能:
(1)加入商品:用戶可以將商品加入購物車,并選擇商品的數量。
(2)刪除商品:用戶可以從購物車中刪除不想要的商品。
(3)修改商品數量:支持用戶修改購物車中商品的數量。
(4)查詢購物車:用戶可以查看購物車中的所有商品信息。
(6)商品結算:用戶挑選自己需要的商品一起下單結算。
商品添加到購物車分為用戶登錄購物車和未登錄購物車(暫存購物車),如京東商城支持用戶登錄和不登錄都可以添加商品到購物車;淘寶商城需要用戶先登錄然后才可以將商品加入購物車,下面我們聊聊購物車的實現。
1、暫存購物車的實現
用戶在未登錄的情況,商品添加到購物車的數據一般都是暫存在客戶端上,每個客戶端保存用戶自己唯一的一個購物車??蛻舳藭捍尜徫镘嚨臄祿R姷姆桨赣蠧ookie、LocalStorage。
1.1、Cookie緩存購物車數據
客戶端與服務端的每次交互都會自動帶著Cookie數據往返,這樣服務端可讀取客戶端Cookie 中的購物車數據;Cookie存儲購物車商品實現簡單,在加減購物車、合并購物車過程中由于服務端讀取操作Cookie中的數據,那么全部邏輯都可在服務端實現。如下是Cookie存儲購物車數據的實現流程圖:
圖片
1.2、LocalStorage緩存購物車數據
LocalStorage里的數據只能由客戶端訪問,然后客戶端再傳給服務器端實現數據的傳遞。使用 LocalStorage存儲購物車數據,實現上相對復雜,客戶端和服務端都要實現業務邏輯,但是LocalStorage的存儲容量比Cookie(4KB)大得多,而且不用像Cookie那樣,每次請求都要帶上,可節省帶寬。
選擇Cookie或LocalStorage 存儲暫存購物車數據,需要根據自身業務場景來選擇:
(1)如果是小型電商業務場景中,Cookie在存儲與實現上起來都是比較好的選擇。
(2)如電商規模較大,用戶需加購商品較多的場景下,選擇LocalStorage 更合適。
2、登錄購物車的實現方案
用戶登錄的購物車實現需要考慮數據存儲方案,即就是購物車數據放緩存(如Redis)還是數據庫(如Mysql),如下設計了一套將購物車數據存儲Redis的加購物車方案:
圖片
如果支持商品暫存購物車,那么當用戶登錄之后需要將客戶端中暫存的商品數據同步到服務端,客戶端以Cookie暫存購物車數據為例的實現流程如下所示:
圖片
用戶登錄成功之后,客戶端將購物車的數據傳遞到服務端,服務端從Cookie中解析購物車數據,然后保存到Redis上并清除Cookie中緩存的購物車數據,通過這樣的合并就可以實現暫存購物車的數據同步。
3、服務端購物車數據的存儲方案
服務端購物車數據可以保存在Redis中也可以保存到Mysql,需要根據實際的業務場景做衡量:
(1)購物車數據存儲在Mysql中,數據可靠性高于Redis,因為Redis有可能發生丟數據的情況;另一方面Mysql支持豐富的查詢方式,使得購物車的數據做查詢和統計的時候非常的方便。用戶的購物車表設計如下所示:
圖片
(2)購物車里的數據存儲在Redis中,數據存儲具有快速、高效、讀寫速度非??臁Y徫镘囋O計中,如果對可靠性要求不高,即使丟少量數據也是可以接受的情況下Redis存儲購物車數據的方案能夠有效提升購物車的性能和用戶體驗度。
(3)有場景需要兼顧可靠性和性能的時候,我們可以采用Redis+Mysql并用的方式來存儲購物車數據。