购物车的存储如何设计
购物车对于数据的可靠性要求并不高,对于性能要求也一般,在整个电商系统中,是一个简单些的子系统
购物车的主要功能就是,将商品加入购物车,购物车列表页显示,发起下单
所以,对应数据实体也很简单,只需要一个购物车实体就可以了,主要的功能就是,SKUID,数量 勾选状态
对于购物车的设计
需要考虑一些简单的问题
比如:
1.用户未登录,在购物车增加商品,关闭浏览器再打开,加狗的商品还在吗?
2.用户未登录,增加后,登录后,商品在吗?
3.关闭浏览器后再打开,上一步加购的还在吗
4.保存后打开手机,之前加购的商品在吗
理论上的设计,应该是,用户如果没登录,加购的商品会被保存在用户的电脑里,即时关闭了浏览器再打开,购物车的商品也会存在
先加购,在登陆,会合并购物车
关闭浏览器再打开,变为未登录,之前的商品合并到登录后的用户了,不存在
手机登录的,会看到这个用户的购物车,和其他无关
如果没有登录,需要临时暂存购物车的商品
用户登录时候,会合并暂存的商品
所以我们一共有两种购物车,一种是没有登陆下的暂存购物车,一种是登录后的用户购物车
1.关于暂存的购物车
我们在未登录的状态下,如何保存数据呢?
可以的选择方式并不多,分别是Session Cookie LocalStorage
如果是使用Session,本质上是存在了服务端,剩下的两种存储,Cookie和LocalStorage都可以保存购物车数据,
Cookie实现简单,而且方便服务器端读写Cookie,请求次数相对少一些
但是使用LocalStorage存储的时候,实现相对就比较复杂些,客户端和服务端就需要实现一些业务逻辑,但是存储的容量就更大,而且不需要每次请求都带着,可以节省带宽
这两者都可以,如果是一个小型的电商,那么Cookie就够了,如果是大量的商品,可能LocalStorage就更加适合了
关于保存的数据,我们极可能的按照实体模型来设计就可以了
直接使用JSON来进行表示了
JSON基本如下
{
“cart”: [ { “SKUID”: 8888, “timestamp”: 1578721136, “count”: 1, “selected”: true }, { “SKUID”: 6666, “timestamp”: 1578721138, “count”: 2, “selected”: false } ] } |
关于用户购物车的存储
我们看下用户购物车的存储如何实现,我们将数据保存在服务器端,以求多端同步,我们常规的思路,就是设计一张购物车表,将数据保存在一个MySQL中,表的结构可以按照实体模型来设计
如果选择简单的使用Redis来保存数据库数据,可以直接以用户ID作为Key,用Redis的HASH保存
整体的结构,KEY是用户ID,FIELD存放的是商品ID,VALUE存放的是一个实体类类似的JSON
对于选择Redis还是MySQL,都是可以实现的
Redis响应快,可以支持更多的并发请求
MySQL数据可靠性更好,因为Redis可能丢失数据,但是购物车对于数据可靠性的要求也没这么苛刻
MySQL的另一个优势是,支持丰富的查询方式和事务机制,方便进行报表统计
综合比较下来,还是使用MySQL来存储更加合适
那么我们说了购物车系统如何设计
购物车的主要功能
加购,购物车列表页和结算下单,实体只有一个购物车的实体类,包含SKUID 数量 加购时间 勾选状态等属性
我们需要考虑用户购物车和暂存购物车两种,以及在用户登录后合并的暂存购物车和用户购物车
暂存购物车存储在客户端浏览器或者APP中,可以存放在Cookie或者LocalStorage中
用户购物车保存在服务端,可以使用Redis或者MySQL存储,使用Reids存储有更高的性能
思考下,购物车这个模块这个需要进行缓存吗
个人觉着毫无必要,因为购物车是和用户一对一的,所以并发程度并不高,所以没必要加上缓存