需求描述
用户可以在 未登录状态下将商品添加到购物车 【游客购物车/ 离线购物车/ 临时购物车】
- 浏览器即使关闭,下次进入, 临时购物车数据都在
用户可以在 登录状态下将商品添加到购物车 【用户购物车/ 在线购物车】
-
登录以后,会将 临时购物车的数据全部合并过来,并清空 临时购物车;
-
用户可以使用购物车一起结算下单
-
给购物车 添加商品
-
用户可以 查询自己的购物车
-
用户可以在购物车中 修改购买商品的数量。
-
用户可以在购物车中 删除商品。
-
选中不选中商品
-
在购物车中展示商品优惠信息
-
提示购物车商品价格变化
用户购物车,你们存在什么位置?
存在 Redis
为什么存在Redis
首先考虑,如果用户登录的情况,为了数据的持久化,要显示用户的购物车数据,那应该将数据存储在 MySQL
但是考虑到购物车的读写都是高并发,会给 MySQL 造成非常大的压力,所以我们选择不用数据库
然后我们考虑使用 NoSQL 的数据库,我们考虑过 MongoDB,它比 MySQL 的性能稍微好一点,但是不会为性能带来很大的提升,
所以我们考虑将数据放到Redis里面,Redis 也是一个 NoSQL 的数据库,
选择它,主要是因为它有以下两个优点,一是数据结构好组织,二是 Redis 拥有极高的并发性能
当然还有一个最大的问题就是,我们需要让购物车的数据持久化存储,这个问题,我们可以通过更改 Redis 的持久化策略,让 Redis 的每一条数据都持久化到磁盘里面,就可以解决,
这样,即使 Redis 宕机,下次也可以取出数据,虽然会损失一定的性能,相当于没有那么高的吞吐量了,但是即使这样做,也比 MySQL 快很多
那临时购物车的数据你们存储到哪?
还是存在 Redis
说说原因
首先,我们考虑过存到浏览器里面,就是只让客户端存储,后台不存,这样的确能给后台减轻很大的压力,但是缺点也很明显,
但是在大数据的情况下,我们需要经常分析用户的数据,做一些推荐算法,就算是用户没登录,我们也应该推荐商品,存储这些数据,促使用户购买,但是如果后台不存的话,我们就没法分析了,
所以我们需要将所有有价值的数据存到后端,经过上面登录用户的购物车分析,我们还是选择放到 Redis 中
数据模型
为了方便修改购物项,在 Redis 中,我们选择用 hash 存储,后来,我们只需要使用类似 Map 的方式,按照 key 查询,就可以快速得到数据,比使用 list 挨个遍历,或者按照购物项的索引找,效率要快的多
@Data
public class CartVO {
private List<CartItemVO> items; // 所有购物车的商品
private Integer countNum; // 所有商品的总数量
private Integer countType; // 商品类型数量
private BigDecimal totalAmount; // 商品总价
private BigDecimal reduce = BigDecimal.ZERO; // 减免价格
@Data
public static class CartItemVO {
private Long skuId;
private Boolean check = true;
private String title;
private String image;
private List<String> skuAttr;
private BigDecimal price;
private Integer count;
private BigDecimal totalPrice;
}
}