购物车的存储如何设计

购物车对于数据的可靠性要求并不高,对于性能要求也一般,在整个电商系统中,是一个简单些的子系统

购物车的主要功能就是,将商品加入购物车,购物车列表页显示,发起下单

所以,对应数据实体也很简单,只需要一个购物车实体就可以了,主要的功能就是,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存储有更高的性能

思考下,购物车这个模块这个需要进行缓存吗

个人觉着毫无必要,因为购物车是和用户一对一的,所以并发程度并不高,所以没必要加上缓存

发表评论

邮箱地址不会被公开。 必填项已用*标注