购物车的设计
离线购物车
用户在没有登录的状态下,可以将商品加入购物车中。
可以查看购物车。
关闭浏览器,再次打开,购物车中的商品存在。
可以删除购物车中的商品,可以选择或者不选择购物车中的商品进行结算。
可以修改购物车中商品的数量。
在线购物车
具备离线购物车的所有功能。
用户登录后,之前离线购物车中的商品能够与在线购物车中的商品进行合并。
将购物车中的商品数据存储在何处?
为了提高系统的并发和吞吐量,首先选择将购物车中的商品数据放在 Redis 中。
- Redis 也可以做数据的持久化,并且 Redis 查询性能好于 MySQL 。
- 将数据存储在服务器端,利用大数据技术可以对商品进行分析,并且再次进入系统时,可以做商品推荐。
购物车数据结构设计
-
购物项
从京东的购物车页面,可以看到,每个购物项,应该设计成如下结构:{ "skuId": 2131241, "check": true, "title": "Apple iphone.....", "defaultImage": "...", "price": 4999, "count": 1, "totalPrice": 4999, "skuSaleVO": {...} }
-
购物车的设计
[ {}, {}, {}, ... ]
-
Redis 中如何存储购物车的数据,如上图,考虑到每个商品的增删改查都比较频繁,因此,存储在Redis中的购物项,考虑使用Redis 的 hash结构。键为 skuId,值为购物项。而每个用户对应一个购物车。而购物车数据在redis中的存储,应该时 用户id作为键,购物车作为值。因此,存储结构应该设计为:Map<String, Map<String, Object>>
临时购物车和在线购物车设计
- 临时购物车是用户状态没有登录时的购物车。
在将商品加入临时购物时,商品后台系统,会生成一个临时的 user-key,并且命令浏览器保存再 cookie中。
而后端系统,会利用临时生成的 user-key 作为将,将对应的购物车数据作为值。存储在 Redis中。
再次访问购物车时候,由于 cookie中保存了临时的 user-key,因此可以利用 user-key 从redis中取出购物车中的商品展示。 - 在线购物车是用户状态已登录时的购物车。
将商品加入购物车时,后端服务会利用用户的key作为键,购物车数据作为值,存储在redis中。
后端服务此时也可以从浏览器中取临时的user-key(如果存在),利用 user-key 取到临时购物车中的数据,与在线购物中的数据进行合并。合并完成后,存储在redis中的临时购物车就可以被删除了。