跳转至

电商购物车如何用 Redis

一、购物车需求

  • 未登录:浏览器本地。
  • 登录:服务端存储。
  • 多端同步。
  • 商品列表、数量、选中状态。
  • 价格计算。

二、数据结构设计

每个用户一个 Hash:

cart:{userId}
  field: itemId
  value: { skuId, count, selected, addTime }
HSET cart:1001 2001 '{"skuId":3001,"count":2,"selected":true,"addTime":1700000000}'

为什么用 Hash

  • 一个用户一个 key,方便管理。
  • 每个商品一个 field,单独增删改。
  • HGETALL 一次拿全部。

三、操作

加购

HSET cart:{userId} {itemId} '{"count":1,...}'

修改数量

HSET cart:{userId} {itemId} '{"count":newCount,...}'

删除

HDEL cart:{userId} {itemId}

选中/取消

// 改 value 里的 selected

清空

DEL cart:{userId}

四、为什么不用 List

  • List 只能顺序存,不支持按 itemId 查。
  • Hash 天然支持"一个用户多个商品"。

五、未登录购物车

存在浏览器 localStorage,登录后合并到 Redis:

localStorage.cart → 登录 → 合并到 Redis cart:{userId}

六、价格计算

购物车里只存 skuId 和数量,价格实时查商品服务:

1. HGETALL cart:{userId} → 拿 skuId 列表
2. 批量调商品服务查价格
3. 计算总价

不在购物车里存价格,防止价格变了不一致。

七、过期策略

购物车数据要长期保留(用户可能放一周才买),不设 TTL。或者长期未活跃才清理。

八、优化

  • 购物车列表加本地缓存。
  • 批量查商品价格(MGET 或 pipeline)。
  • 大购物车分页。

对比

  • Hash:一个用户一个 key,字段是商品。
  • String + JSON:也行,但改一个商品要重写整个 JSON。