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