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