購物車實現(xiàn)之Cookie、Session艳馒、數(shù)據(jù)庫優(yōu)缺點(diǎn)分析

目前我們使用購物車的存儲方式主要有:Session方式憎亚,Cookie方式,數(shù)據(jù)庫存儲弄慰,我們來一一分析優(yōu)缺點(diǎn)第美。
1.Session(Memcached)方式

優(yōu)點(diǎn):購物車信息保存在服務(wù)端,可以保存1M 信息陆爽。
缺點(diǎn):對于大型網(wǎng)站會占有過多的服務(wù)器內(nèi)存資源什往,造成服務(wù)器壓力過大。Session保存的信息會在用戶退出登錄后丟失慌闭。用戶下次登錄别威,購物車中商品信息丟失,用戶只能從新選擇驴剔。

2.Cookie方式

優(yōu)點(diǎn):購物車信息存儲在客戶端省古,不占用服務(wù)器資源,基本可以到達(dá)持久化存儲仔拟。
缺點(diǎn):Cookie有大小的限制衫樊,不能超過4K,而且不夠安全。如果是個人PC機(jī)科侈,Cookie能很好的保存購物車信息载佳,但如果是公共辦公環(huán)境,Cookie保存的信息基本就失效了(會被其他人購物車信息覆蓋)臀栈。對一個大型的電子商務(wù)網(wǎng)站蔫慧,我們需要對用戶的購買行為進(jìn)行分析,需要對用戶推薦用戶感興趣的商品权薯,如果把購物車信息保存在Cookie中姑躲,則不能對用戶購買行為分析統(tǒng)計。

3.數(shù)據(jù)庫存儲

優(yōu)點(diǎn):持久化存儲盟蚣,可以分析用戶購買行為黍析。
缺點(diǎn): 網(wǎng)站速度變慢,成本和維護(hù)增加屎开。

對于一個大型的電子商務(wù)網(wǎng)站阐枣,我們需要知道用戶對什么樣的商品感興趣,需要給用戶推薦相似度商品奄抽。那么就有必要分析用戶的購買行為蔼两。在這里只詳細(xì)講述下使用數(shù)據(jù)庫存儲方式的演變。開始我們是使用Cookie存儲購物車的信息逞度,但使用一段時間后發(fā)現(xiàn)有很多客戶投訴额划,購物車中常常會多了很多商品,而且并不是客戶選擇的商品档泽。數(shù)據(jù)挖掘部門也抱怨不能分析購物車的信息俊戳。。馆匿。品抽。我們決定改變購物車的存儲方式。開始我們設(shè)計的表是這樣的:

圖片1.jpg

對于登錄用戶甜熔,我們根據(jù)UserId查詢購物車信息圆恤。對于非登錄用戶,則根據(jù)瀏覽器選擇查詢方式腔稀,如果是火狐瀏覽器盆昙,我們根據(jù)SessionId查詢,如果是IE或360瀏覽器焊虏,我們根據(jù)IP查詢淡喜。在一天訂單量只有幾萬單的時候,系統(tǒng)運(yùn)行的很穩(wěn)定诵闭。但發(fā)現(xiàn)一天訂單量超過10萬單的時候炼团,特別是高峰期澎嚣,購物車數(shù)據(jù)庫寫壓力特別大。查詢也時常超時瘟芝。我們不得不清理存儲時間超過10天的數(shù)據(jù)易桃。我們新建一個Job每天夜里執(zhí)行刪除超過10天的數(shù)據(jù)。但隨著訂單量的增加锌俱。數(shù)據(jù)庫寫壓力依然很大晤郑。這時候我們考慮分庫來解決數(shù)據(jù)庫的寫壓力。我們根據(jù)登錄用戶和匿名用戶來拆庫贸宏。采用如圖方式

圖片2.jpg

對于登錄用戶我們根據(jù)UserId拆成2個庫造寝,一個是奇數(shù)庫,一個是偶數(shù)庫吭练。對于匿名用戶我們根據(jù)瀏覽器拆分诫龙,火狐瀏覽器(SessionId查詢)一個庫,IE或360瀏覽器(根據(jù)IP查詢)一個庫鲫咽。
對于表結(jié)構(gòu)赐稽,我們也做了調(diào)整。使用UserId和CreatedDateTicks時間撮做聯(lián)合主鍵浑侥,登錄用戶購物車表結(jié)構(gòu):

圖片3.jpg

匿名用戶(火狐瀏覽器)存儲表結(jié)構(gòu):

圖片4.jpg

IE或360瀏覽器存儲表結(jié)構(gòu):

圖片5.jpg

數(shù)據(jù)存儲方面我們也做了調(diào)整。刪掉了大量的數(shù)據(jù)庫更新操作晰绎,因為大量的更新操作會造成鎖表寓落。購物車信息發(fā)生變化時,Content保存用戶購物車信息的XML≤裣拢現(xiàn)在只需做插入操作了伶选。查詢數(shù)據(jù)時,返回最后一條數(shù)據(jù)即可尖昏。采用分庫后減輕了單臺數(shù)據(jù)庫寫數(shù)據(jù)的壓力仰税,Content保存購物車信息的XML避免大量的更新操作。現(xiàn)在系統(tǒng)可以平穩(wěn)的運(yùn)行了抽诉!

一般來說陨簇,可以使用session,cookie和數(shù)據(jù)庫來記錄購物車數(shù)據(jù)
1,不過不提倡使用session迹淌,這貨占用服務(wù)器資源河绽,還有過期時間,客戶關(guān)掉瀏覽器時session即消失唉窃,下次再上來耙饰,又得重新選產(chǎn)品。
2纹份,cookie這東西不錯苟跪,放在客戶端的廷痘,給個一年的過期時間,只要客戶不清掉件已,每次來都能記得上次的購物車信息笋额。大家可以看看京東,
在購物車cookie中存了不少東西拨齐,有產(chǎn)品編碼和購買的數(shù)量等信息鳞陨,如京東:yCartOrderLogic={&TheSkus&:[{&Id&:437741$&Num&:2}]},
原來凡客的cookie中也以JSON的形式存了很多信息瞻惋。
所以厦滤,我以學(xué)習(xí)的心態(tài),將產(chǎn)品編碼歼狼,價格掏导,名稱,類型和數(shù)量等購物信息做成一個對象羽峰,然后對象序列化成JSON趟咆,存在客戶端的COOKIE中,
在讀取cookie時梅屉,在剛開始的時候很好用值纱,反序列化cookie值成購物車條目對象就可以了,但是當(dāng)產(chǎn)品類型多起來之后坯汤,而且有套裝那種多件產(chǎn)品時虐唠,
甚至產(chǎn)品不是來自同一個數(shù)據(jù)表時,比如普通首飾和鉆石惰聂,表的結(jié)構(gòu)都不一樣了疆偿,還得到不同的表格中去取,當(dāng)然首先你得判斷產(chǎn)品類型
這時候一個購物條目對象已經(jīng)有多條子對象搓幌,往往一個查詢中嵌套著兩重以上的循環(huán)加上多個switch case杆故,當(dāng)購物車中有十個復(fù)雜的條目時,讀取速度
將超過十秒溉愁,不管怎么優(yōu)化处铛,速度就擺在那里,不快不慢拐揭。罢缸。。而且你不能保證客戶不下100個或更多的復(fù)雜購物車記錄投队,最重要的是cookie是有
存儲大小限制的枫疆,這種做法有產(chǎn)品很復(fù)雜時是不利的,果斷放棄敷鸦!
3息楔,數(shù)據(jù)庫這東西好啊寝贡,不會像cookie那種容易丟失,也沒有客戶端的限制值依,你想怎么存圃泡,存多少都行。

購物車數(shù)據(jù)存數(shù)據(jù)庫好處有很多愿险,可以分析購買行為颇蜡,可以為客戶保存購買信息(不會因為瀏覽器關(guān)閉而丟失)等。
還需要考慮的一個問題是用戶是否登錄辆亏,淘寶使用的就是cookie記錄风秤,你可以試試,未登錄時可以加20個商品扮叨,登錄后可以加50個缤弦,這就是因為
cookie客戶端的限制。
我這里因為產(chǎn)品線的復(fù)雜性彻磁,所有購物車條目都保存在數(shù)據(jù)庫中碍沐。

購物車數(shù)據(jù)庫設(shè)計成兩個關(guān)聯(lián)表
1,Basket衷蜓,購物車主表
基本字段有:BasketId,AddTime,UserId,AddressId,Payment,Status等累提,不解釋了,看英文意思就行
2磁浇,BasketDetail斋陪,購物車條目表
基本字段有:BasketDetailId,BasketId,Type,Code,Qty,ParentId等,ParentId用作子行標(biāo)識扯夭,其它不解釋
兩個表之間使用BasketId做為關(guān)聯(lián)
當(dāng)用戶登錄狀態(tài)時,添加產(chǎn)品到購物時鞍匾,查看Basket中是否有Status為True的購物車交洗,沒有則添加一條新的Basket記錄,并將產(chǎn)品信息相關(guān)數(shù)據(jù)添加至BasketDetail表中
當(dāng)用戶未登錄時橡淑,使用cookie記錄一個BasketId值构拳,不往Basket表中插入數(shù)據(jù),只往BasketDetail插入數(shù)據(jù)梁棠,其中的BasketId值使用cookie中的BasketId值置森,當(dāng)用戶登錄
后,查看Basket中是否有Status為True的購物車記錄符糊,有則合并(更新cookie和BasketDetail中的BasketId為查詢出來的Basket表中的BasketId值)凫海,無則添加一條新的
Basket記錄,并將BasketId值置為Cookie中記錄的basketid值男娄。
(轉(zhuǎn)載CSDN隨風(fēng)飄揚(yáng)中博主的博文)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末行贪,一起剝皮案震驚了整個濱河市漾稀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌建瘫,老刑警劉巖崭捍,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異啰脚,居然都是意外死亡殷蛇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門橄浓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粒梦,“玉大人,你說我怎么就攤上這事贮配〉耄” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵泪勒,是天一觀的道長昼蛀。 經(jīng)常有香客問我,道長圆存,這世上最難降的妖魔是什么叼旋? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮沦辙,結(jié)果婚禮上夫植,老公的妹妹穿的比我還像新娘。我一直安慰自己油讯,他們只是感情好详民,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著陌兑,像睡著了一般沈跨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兔综,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天饿凛,我揣著相機(jī)與錄音,去河邊找鬼软驰。 笑死涧窒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锭亏。 我是一名探鬼主播纠吴,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼慧瘤!你這毒婦竟也來了呜象?” 一聲冷哼從身側(cè)響起膳凝,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恭陡,沒想到半個月后蹬音,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡休玩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年著淆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拴疤。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡永部,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呐矾,到底是詐尸還是另有隱情苔埋,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布蜒犯,位于F島的核電站组橄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏罚随。R本人自食惡果不足惜玉工,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淘菩。 院中可真熱鬧遵班,春花似錦、人聲如沸潮改。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汇在。三九已至翰萨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間趾疚,已是汗流浹背缨历。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工以蕴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留糙麦,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓丛肮,卻偏偏與公主長得像赡磅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宝与,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容