购物车
2022/10/5大约 2 分钟
购物车
本篇记录购物车模块的开发思路与购物车实体设计:购物车数据存入 Redis,用 Hash 结构按用户维度隔离存储。
1. 购物车开发思路
购物车是典型的"高频读写、随登录态变化"的数据,项目选择用 Redis 的 Hash 结构存储购物车数据:
Redis 存储购物车数据结构:Hash
K => menhu:cart
field => ${userid}
value => ${cart}| 结构要素 | 内容 | 说明 |
|---|---|---|
| Key | menhu:cart | 固定的购物车总键 |
| field | ${userid} | 用户 id,一个用户对应一个 field,实现按用户隔离 |
| value | ${cart} | 该用户的购物车数据(Cart 集合序列化后的内容) |
选择 Hash 的好处:
- 所有用户的购物车集中在一个 Key 下,便于统一管理(如统计、清理);
- 按用户 id 精确读写一个 field,不会读写整表,粒度小、效率高。
2. 加购
加购即把商品加入购物车。首先定义购物车条目实体 Cart,加购时构造该对象并写入 Redis Hash 中当前用户的 field:
package com.fengmi.cart;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 购物车条目:一条记录对应购物车中的一个 sku
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Cart {
/** sku id,购物车中定位商品的主键 */
private String skuId;
/** 商品标题 */
private String title;
/** 商品图片地址 */
private String img;
/** 规格信息,如"口味:原味;包装:情侣装" */
private String spec;
/** 售价,单位:元 */
private Double price;
/** 市场价(原价),单位:元 */
private Double marketPrice;
/** 购买数量 */
private Integer buyNum;
/** 是否勾选结算,默认未勾选 */
private boolean choose = false;
}3. 购物车列表
购物车列表即读取当前用户的购物车数据:以 menhu:cart 为 Key、用户 id 为 field 从 Redis 中取出 value,反序列化为 Cart 集合后返回给前端展示(标题、图片、单价、数量、勾选状态)。
4. 购物车编辑
购物车编辑包括修改购买数量、勾选/取消勾选等操作:先读出当前用户的 Cart 集合,按 skuId 定位对应条目并修改属性,再把整个集合写回 Redis Hash 的同一个 field。
注
由于 value 是整个购物车集合,编辑操作遵循"读出 → 修改 → 写回"的整体更新模式;skuId 是集合内定位条目的唯一标识,这也是 Cart 实体中保留它的原因。
