✅P237_商城业务-购物车-数据模型分析

gong_yz大约 3 分钟谷粒商城

购物车功能分析

需求描述

  • 用户可以使用购物车一起结算下单
  • 给购物车添加商品
  • 用户可以查询自己的购物车
  • 用户可以在购物车中修改购买商品的数量
  • 用户可以在购物车中删除商品
  • 选中/不选中商品
  • 在购物车中展示商品优惠信息
  • 提示购物车商品价格变化

数据结构

因此每一个购物项信息,都是一个对象,基本字段包括:

{
	skuId: 2131241, 
	check: true, 
	title: "Apple iphone.....", 
	defaultImage: "...", 
	price: 4999, 
	count: 1, 
	totalPrice: 4999, 
	skuSaleVO: {...}
}

另外,购物车中不止一条数据,因此最终会是对象的数组。即:

[
  {...},{...},{...}
]

怎么保存

由于购物车是一个读多写多的场景,为了应对高并发场景,所有购物车采用的存储方案也和其他功能,有所差别。

主流的购物车数据存储方案

  1. redis(登录/未登录):性能高,代价高,不利于数据分析
  2. mysql(登录/未登录):性能低,成本低,利于数据分析
  3. cookie(未登录):未登录时,不需要和服务器交互,性能提高。其他请求会占用带宽
  4. localStorage/IndexedDB/WebSQL(未登录):不需要和服务器交互,不占用带宽

一般情况下,企业级购物车通常采用组合方案

  1. cookie(未登录时) + mysql(登录时)
  2. cookie(未登录) + redis(登录时)
  3. localStorage/IndexedDB/WebSQL(未登录) + redis(登录)
  4. localStorage/IndexedDB/WebSQL(未登录) + mysql(登录)

随着数据价值的提升,企业越来越重视用户数据的收集,现在以上4种方案使用的越来越少。

当前大厂普遍采用:redis + mysql

不管是否登录都把数据保存到mysql,为了提高性能可以搭建mysql集群,并引入redis。

查询时,从redis查询提高查询速度,写入时,采用双写模式

mysql保存购物车很简单,创建一张购物车表即可。

Redis有5种不同数据结构,这里选择哪一种比较合适呢?

  • 首先不同用户应该有独立的购物车,因此购物车应该以用户的作为key来存储,Value是用户的所有购物车信息。这样看来基本的k-v结构就可以了。
  • 但是,我们对购物车中的商品进行增、删、改操作,基本都需要根据商品id进行判断,为了方便后期处理,我们的购物车也应该是k-v结构,key是商品id,value才是这个商品的购物车信息。

综上所述,我们的购物车结构是一个双层Map:Map<String,Map<String,String>>

  • 第一层Map,Key是用户id
  • 第二层Map,Key是购物车中商品id,值是购物车数据

流程分析

参照京东

user-key 是随机生成的 id,不管有没有登录都会有这个 cookie 信息。

两个功能:新增商品到购物车、查询购物车。

新增商品:判断是否登录

  • 是:则添加商品到后台 Redis 中,把 user 的唯一标识符作为 key。
  • 否:则添加商品到后台 redis 中,使用随机生成的 user-key 作为 key。

查询购物车列表:判断是否登录

  • 否:直接根据 user-key 查询 redis 中数据并展示
  • 是:已登录,则需要先根据 user-key 查询 redis 是否有数据。
    • 有:需要提交到后台添加到 redis,合并数据,而后查询。
    • 否:直接去后台查询 redis,而后返回。