在电商平台中,购物车是一个非常核心的功能,用户浏览商品的过程中,他们可以将感兴趣的商品加入购物车方便后面挑选和下单。购物车功能的设计对于提升用户体验、增加公司商品销售量都有重要影响。
图片
上图是一个典型的电商购物车的图,购物车协助用户选购商品时提供如下的功能:
(1)加入商品:用户可以将商品加入购物车,并选择商品的数量。
(2)删除商品:用户可以从购物车中删除不想要的商品。
(3)修改商品数量:支持用户修改购物车中商品的数量。
(4)查询购物车:用户可以查看购物车中的所有商品信息。
(6)商品结算:用户挑选自己需要的商品一起下单结算。
商品添加到购物车分为用户登录购物车和未登录购物车(暂存购物车),如京东商城支持用户登录和不登录都可以添加商品到购物车;淘宝商城需要用户先登录然后才可以将商品加入购物车,下面我们聊聊购物车的实现。
1、暂存购物车的实现
用户在未登录的情况,商品添加到购物车的数据一般都是暂存在客户端上,每个客户端保存用户自己唯一的一个购物车。客户端暂存购物车的数据常见的方案有Cookie、LocalStorage。
1.1、Cookie缓存购物车数据
客户端与服务端的每次交互都会自动带着Cookie数据往返,这样服务端可读取客户端Cookie 中的购物车数据;Cookie存储购物车商品实现简单,在加减购物车、合并购物车过程中由于服务端读取操作Cookie中的数据,那么全部逻辑都可在服务端实现。如下是Cookie存储购物车数据的实现流程图:
图片
1.2、LocalStorage缓存购物车数据
LocalStorage里的数据只能由客户端访问,然后客户端再传给服务器端实现数据的传递。使用 LocalStorage存储购物车数据,实现上相对复杂,客户端和服务端都要实现业务逻辑,但是LocalStorage的存储容量比Cookie(4KB)大得多,而且不用像Cookie那样,每次请求都要带上,可节省带宽。
选择Cookie或LocalStorage 存储暂存购物车数据,需要根据自身业务场景来选择:
(1)如果是小型电商业务场景中,Cookie在存储与实现上起来都是比较好的选择。
(2)如电商规模较大,用户需加购商品较多的场景下,选择LocalStorage 更合适。
2、登录购物车的实现方案
用户登录的购物车实现需要考虑数据存储方案,即就是购物车数据放缓存(如Redis)还是数据库(如Mysql),如下设计了一套将购物车数据存储Redis的加购物车方案:
图片
如果支持商品暂存购物车,那么当用户登录之后需要将客户端中暂存的商品数据同步到服务端,客户端以Cookie暂存购物车数据为例的实现流程如下所示:
图片
用户登录成功之后,客户端将购物车的数据传递到服务端,服务端从Cookie中解析购物车数据,然后保存到Redis上并清除Cookie中缓存的购物车数据,通过这样的合并就可以实现暂存购物车的数据同步。
3、服务端购物车数据的存储方案
服务端购物车数据可以保存在Redis中也可以保存到Mysql,需要根据实际的业务场景做衡量:
(1)购物车数据存储在Mysql中,数据可靠性高于Redis,因为Redis有可能发生丢数据的情况;另一方面Mysql支持丰富的查询方式,使得购物车的数据做查询和统计的时候非常的方便。用户的购物车表设计如下所示:
图片
(2)购物车里的数据存储在Redis中,数据存储具有快速、高效、读写速度非常快。购物车设计中,如果对可靠性要求不高,即使丢少量数据也是可以接受的情况下Redis存储购物车数据的方案能够有效提升购物车的性能和用户体验度。
(3)有场景需要兼顾可靠性和性能的时候,我们可以采用Redis+Mysql并用的方式来存储购物车数据。