在用戶(hù)選購(gòu)商品時(shí),下單前,暫存用戶(hù)想購(gòu)買(mǎi)的商品。
創(chuàng)新互聯(lián)建站成立與2013年,先為平順等服務(wù)建站,平順等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為平順企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。購(gòu)物車(chē)對(duì)數(shù)據(jù)可靠性要求不高,性能也無(wú)特別要求,在整個(gè)電商系統(tǒng)是相對(duì)容易設(shè)計(jì)和實(shí)現(xiàn)的一個(gè)子系統(tǒng)。
購(gòu)物車(chē)系統(tǒng)的主要功能:
支撐這些功能,存儲(chǔ)模型如何設(shè)計(jì)?
只要一個(gè)“購(gòu)物車(chē)”實(shí)體。
2 主要屬性打開(kāi)京東購(gòu)物車(chē)頁(yè)面:SKUID(商品ID)、數(shù)量、加購(gòu)時(shí)間和勾選狀態(tài)
“勾選狀態(tài)”屬性,即在購(gòu)物車(chē)界面,每件商品前面的那個(gè)小對(duì)號(hào),表示在結(jié)算下單時(shí),是否要包含這件商品。至于商品價(jià)格和總價(jià)、商品介紹等都能實(shí)時(shí)從其他系統(tǒng)獲取,無(wú)需購(gòu)物車(chē)系統(tǒng)保存。
購(gòu)物車(chē)功能簡(jiǎn)單,但設(shè)計(jì)購(gòu)物車(chē)系統(tǒng)的存儲(chǔ)時(shí),仍有一些問(wèn)題需考慮。
3 原則 3.1 思考 3.1.1 用戶(hù)未登錄,在瀏覽器中加購(gòu),關(guān)閉瀏覽器再打開(kāi),剛才加購(gòu)的商品還在嗎?存在。
若用戶(hù)未登錄,加購(gòu)的商品也會(huì)被保存在用戶(hù)的電腦。即使關(guān)閉瀏覽器再打開(kāi),購(gòu)物車(chē)的商品仍存在。
3.1.2 用戶(hù)未登錄,在瀏覽器中加購(gòu),然后登錄,剛才加購(gòu)的商品還在嗎?存在。
若用戶(hù)先加購(gòu),再登錄。登錄前加購(gòu)的商品就會(huì)被自動(dòng)合并到用戶(hù)名下,所以登錄后購(gòu)物車(chē)中仍有登錄前加購(gòu)的商品。
3.1.3 關(guān)閉瀏覽器再打開(kāi),上一步加購(gòu)的商品還在嗎?不存在。
關(guān)閉瀏覽器再打開(kāi),這時(shí)又變?yōu)槲吹卿洜顟B(tài),但是之前未登錄時(shí)加購(gòu)的商品已經(jīng)被合并到剛剛登錄的用戶(hù)名下了,所以購(gòu)物車(chē)是空的。
3.1.4 再打開(kāi)手機(jī),用相同的用戶(hù)登錄,第二步加購(gòu)的商品還在嗎?存在。使用手機(jī)登錄相同的用戶(hù),看到的就是該用戶(hù)的購(gòu)物車(chē),這時(shí)無(wú)論你在手機(jī)App、電腦還是微信中登錄,只要相同用戶(hù),看到就是同一購(gòu)物車(chē),所以第2步加購(gòu)的商品是存在的。
若不仔細(xì)把這些問(wèn)題考慮清楚,用戶(hù)使用購(gòu)物車(chē)時(shí),就會(huì)感覺(jué)不好用,不是加購(gòu)的商品莫名其妙丟了,就是購(gòu)物車(chē)莫名其妙多出一些商品。
要解決上面這些問(wèn)題,只要在存儲(chǔ)設(shè)計(jì)時(shí),把握如下
3.2 原則購(gòu)物車(chē)系統(tǒng)需保存兩類(lèi)購(gòu)物車(chē):
若存在服務(wù)端,則每個(gè)暫存購(gòu)物車(chē)都得有個(gè)全局唯一標(biāo)識(shí),這不易設(shè)計(jì)。保存在服務(wù)端,還要浪費(fèi)服務(wù)端資源。所以,肯定保存在客戶(hù)端:
節(jié)約服務(wù)器存儲(chǔ)資源
無(wú)購(gòu)物車(chē)標(biāo)識(shí)問(wèn)題
每個(gè)客戶(hù)端就保存它自己唯一一個(gè)購(gòu)物車(chē)即可,無(wú)需標(biāo)識(shí)。
客戶(hù)端存儲(chǔ)可選擇不多:
Session
不太合適。SESSION保留時(shí)間短,且SESSION的數(shù)據(jù)實(shí)際上還是保存在服務(wù)端
Cookie
LocalStorage
瀏覽器的LocalStorage和App的本地存儲(chǔ)類(lèi)似,都以LocalStorage代表。Cookie、LocalStorage都可用來(lái)保存購(gòu)物車(chē)數(shù)據(jù)。
選擇哪種更好?各有優(yōu)劣。這場(chǎng)景中,使用Cookie和LocalStorage最關(guān)鍵區(qū)別:
使用Cookie存儲(chǔ),實(shí)現(xiàn)簡(jiǎn)單,加減購(gòu)物車(chē)、合并購(gòu)物車(chē)過(guò)程,由于服務(wù)端可讀寫(xiě)Cookie,這樣全部邏輯都可在服務(wù)端實(shí)現(xiàn),并且客戶(hù)端和服務(wù)端請(qǐng)求的次數(shù)也相對(duì)少。
使用LocalStorage存儲(chǔ),實(shí)現(xiàn)相對(duì)復(fù)雜,客戶(hù)端和服務(wù)端都要實(shí)現(xiàn)業(yè)務(wù)邏輯,但LocalStorage好在其存儲(chǔ)容量比Cookie的4KB上限大得多,而且不用像Cookie那樣,無(wú)論用不用,每次請(qǐng)求都要帶著,可節(jié)省帶寬。
所以,選擇Cookie或LocalStorage存儲(chǔ)“暫存購(gòu)物車(chē)”都行,根據(jù)優(yōu)劣勢(shì)選型即可:
不管哪種存儲(chǔ),暫存購(gòu)物車(chē)保存的
4.2 數(shù)據(jù)格式都一樣。參照實(shí)體模型設(shè)計(jì),JSON表示:
{"cart": [
{"SKUID": 8888,
"timestamp": 1578721136,
"count": 1,
"selected": true
},
{"SKUID": 6666,
"timestamp": 1578721138,
"count": 2,
"selected": false
}
]
}
5 用戶(hù)購(gòu)物車(chē) 存儲(chǔ)設(shè)計(jì)用戶(hù)購(gòu)物車(chē)須保證多端數(shù)據(jù)同步,數(shù)據(jù)須保存在服務(wù)端。常規(guī)思路:設(shè)計(jì)一張購(gòu)物車(chē)表,把數(shù)據(jù)存在MySQL。表結(jié)構(gòu)同樣參照實(shí)體模型:
需在user_id建索引,因?yàn)椴樵?xún)購(gòu)物車(chē)表,都以u(píng)ser_id作為查詢(xún)條件。
也可選擇更快的Redis保存購(gòu)物車(chē)數(shù)據(jù):
如:
{"KEY": 6666,
"VALUE": [
{"FIELD": 8888,
"FIELD_VALUE": {"timestamp": 1578721136,
"count": 1,
"selected": true
}
},
{"FIELD": 6666,
"FIELD_VALUE": {"timestamp": 1578721138,
"count": 2,
"selected": false
}
}
]
}
為便理解,用JSON表示Redis中HASH的數(shù)據(jù)結(jié)構(gòu):
讀寫(xiě)性能,Redis比MySQL快得多,Redis就一定比MySQL好嗎?
5.1 MySQL V.S Redis 存儲(chǔ)綜合比較下來(lái),考慮到需求變化,推薦MySQL存儲(chǔ)購(gòu)物車(chē)數(shù)據(jù)。若追求性能或高并發(fā),也可選擇使用Redis。
設(shè)計(jì)存儲(chǔ)架構(gòu)過(guò)程就是不斷抉擇過(guò)程。很多情況下,可選擇方案不止一套,選擇時(shí)需考慮實(shí)現(xiàn)復(fù)雜度、性能、系統(tǒng)可用性、數(shù)據(jù)可靠性、可擴(kuò)展性等。這些條件每一個(gè)都不是絕對(duì)不可以犧牲的,不要讓一些“所謂的常識(shí)”禁錮思維。
比如,一般認(rèn)為數(shù)據(jù)絕不可丟,即不能犧牲數(shù)據(jù)可靠性。但用戶(hù)購(gòu)物車(chē)存儲(chǔ),使用Redis替代MySQL,就是犧牲數(shù)據(jù)可靠性換取高性能。很低概率的丟失少量數(shù)據(jù)可接受。性能提升帶來(lái)的收益遠(yuǎn)大于丟失少量數(shù)據(jù)而付出的代價(jià),這選擇就值得。
如果說(shuō)不考慮需求變化這個(gè)因素,犧牲一點(diǎn)點(diǎn)數(shù)據(jù)可靠性,換取大幅性能提升,Redis是最優(yōu)解。
6 總結(jié)在給購(gòu)物車(chē)設(shè)計(jì)存儲(chǔ)時(shí),為確保:
除了每個(gè)用戶(hù)的“用戶(hù)購(gòu)物車(chē)”,還要實(shí)現(xiàn)一個(gè)“暫存購(gòu)物車(chē)”保存用戶(hù)未登錄時(shí)加購(gòu)的商品,并在用戶(hù)登錄后自動(dòng)合并“暫存購(gòu)物車(chē)”和“用戶(hù)購(gòu)物車(chē)”。
暫存購(gòu)物車(chē)存儲(chǔ)在客戶(hù)端瀏覽器或App,可存放到Cookie或LocalStorage。用戶(hù)購(gòu)物車(chē)保存在服務(wù)端,可以選擇使用:
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧