購物車的功能實現(xiàn),通常來講有3種方法。
1.用cookie實現(xiàn)購物車;
【缺點】:
單純有cookie實現(xiàn)購物車,這樣的購物車不是很理想,假想1下,如果客戶真?zhèn)€閱讀器把cookie給禁用了,
這類方法就會在這里掛掉。
2.用seeesion實現(xiàn)購物車;
【缺點】:
session中保存購物車的信息,這個只是在1個會話中可用,如果用戶沒有登錄,或說登錄了以后,添加購物車,在關(guān)閉閱讀器
或登出后,之前所添加的購物車就只有掛掉了。
3.用cookie和數(shù)據(jù)庫(購物車信息持久化)實現(xiàn)購物車;
主要的流程:
A.用戶登錄前的數(shù)據(jù)流:用戶在沒有登錄系統(tǒng)的時候,對喜歡的商品進行添加購物車,那末這個時候,我們可以把購物車信息保存到cookie中,這里會觸及到cookie的添加,修改操作;也即如果之前在cookie中不存對應(yīng)的cookie,則就對cookie進行添加操作。如果在cookie中存在對應(yīng)的cookie,那末,這時候候,就要對cookie進行修改操作了(這里觸及到用戶對同1個商品進行屢次添加購物車的情況)。
B.用戶登錄后的數(shù)據(jù)流:用戶在登錄后,系統(tǒng)首先做的第1件事就是去獲得對應(yīng)的cookies,如果存在相干的購物車cookies,那末就對該購物車信息進行相利用戶User的持久化操作,要末添加,要末修改。(添加操作:該用戶所對應(yīng)的購物車如果沒有相應(yīng)的信息進行添加操作;修改操作:類似的,如果存在對利用戶的購物車信息,就進行修改操作)。用戶登錄后,也能夠進行購物車的添加操作,不過,這里不是添加到cookie中,而是直接持久化到數(shù)據(jù)庫中。
注:用戶登錄后的數(shù)據(jù)都是和數(shù)據(jù)庫打交道。
完善購物車功能:
1. cookie中的購物車數(shù)據(jù)格式改造
直接將購物車數(shù)據(jù)保存到cookie中的問題:
a)閱讀器對cookie的大小限制,不能攜帶太多商品信息,不能滿足用戶需求
b ) 如果cookie中內(nèi)容太多,http要求會攜帶cookie信息,影響要求的效力
改造:
之前cookie中的數(shù)據(jù)格式為json數(shù)據(jù):
這個結(jié)構(gòu)存在的問題:
1. a)商品的屬性太多,只保存itemId,itemTitle等信息可以通過接口查詢
b)從業(yè)務(wù)上理解,保存商品加入購物車時快照信息
c)由產(chǎn)品經(jīng)理決定,將商品加入到購物車時是不是要保存快照信息?
2. 對商品的新增、刪除、修改數(shù)量,每次都要將數(shù)據(jù)反序列化成List集合,
然后對集合遍歷找出Cart對象,再做修改
解決問題:
1、 不能保存到cookie
a) 保存到redis
i. 性能高
ii. redis和cookie都有生存時間
2、 改造數(shù)據(jù)存儲格式
a) 使用redis中的hash結(jié)構(gòu)
當(dāng)用戶對商品添加、刪除的時候,只需要通過cart_key獲得id,操作id;更新商品時,通過id獲得到j(luò)son格式數(shù)據(jù)對其進行更新操作。
重點是改造cookie中的value,以下圖
對應(yīng)的邏輯,這是原始的,直接向cookie中寫入商品詳情:
目前,我們是將商品信息保存在cookie中的。
重構(gòu)以后使用redis的Hash結(jié)構(gòu)
修改未登錄情況下的,信息保存:
RedisService 的 hget()方法,改造:
hset() :hash結(jié)構(gòu)的設(shè)置值
hdel() :hash結(jié)構(gòu)的刪除數(shù)據(jù)
hgetAll():hash結(jié)構(gòu)的查詢所有數(shù)據(jù)
添加商品到購物車的代碼重構(gòu):
顯示購物車數(shù)據(jù):
private static final Integer SECONDS = 60 * 60 * 24 * 30 (30天)
頁面展現(xiàn):
問題:
Redis中的key保存在客戶端閱讀器的cookie中,用戶可以通過閱讀器清空cookie,那末Redis中的數(shù)據(jù)就會長時間保存在Redis中。
解決:
根據(jù)活躍度(查詢頻率)
i. 記錄數(shù)據(jù)的訪問的最后時間
ii. 根據(jù)當(dāng)前時間和最后時間做比較,如果超過指定時間,則需要刪除
this.redisService.hset(key ,"updated", String.valueOf(system.currentTimeMillis()));
iii. 需要編寫Quartz定時任務(wù)實現(xiàn)?TODO
redis中的數(shù)據(jù)查詢:
頁面結(jié)果:
用戶操作購物車記錄到cookie和redis的實現(xiàn)
1種情況是:1直訪問購物車,處于活躍狀態(tài)
1種情況是:1直訪問網(wǎng)站,但是不訪問購物車,假定訪問商品詳情頁時刷新購物車cookie和redis數(shù)據(jù),需要注冊攔截器
注冊攔截器
還有1種情況是:人為的將閱讀器的cookie清空
a) 記錄購物車數(shù)據(jù)的最后訪問時間,后臺任務(wù)掃描比對該數(shù)據(jù),做數(shù)據(jù)清算
this.redisService.hset(key ,"updated", String.valueOf(system.currentTimeMillis()));
上一篇 git 對比兩個分支差異