Redis、MySQL、价格刷新、下单校验:购物车系统一次讲透

张开发
2026/4/19 3:19:29 15 分钟阅读

分享文章

Redis、MySQL、价格刷新、下单校验:购物车系统一次讲透
电商购物车怎么设计一次讲清存储模型、价格刷新、勾选状态与并发更新思路大家好我是一名有 4 年工作经验的 Java 后端开发。购物车看起来像电商系统里最普通的模块但真正做过的人都知道它其实连接着商品、库存、价格、优惠、下单、登录态同步等很多环节。这篇文章我想系统聊一聊购物车到底应该怎么设计。个人主页文章目录电商购物车怎么设计一次讲清存储模型、价格刷新、勾选状态与并发更新思路一、购物车为什么没那么简单二、购物车里到底要存什么为什么三、数据库和 Redis 怎么选3.1 Redis 适合什么3.2 MySQL 适合什么3.3 最常见的落地方式四、推荐表结构五、核心流程怎么设计5.1 加入购物车5.2 修改数量5.3 勾选 / 取消勾选5.4 查询购物车5.5 提交订单六、最容易踩的坑6.1 把实时价格直接长期存购物车6.2 不做唯一键导致同一个 SKU 多条记录6.3 提交订单时直接信购物车价格6.4 未登录购物车和登录购物车合并没设计好七、面试中怎么回答八、总结九、结尾一、购物车为什么没那么简单很多人会觉得购物车很简单用户加个商品选个数量提交订单时一起带过去但真实系统里购物车至少会碰到这些问题未登录购物车和登录购物车怎么合并商品下架后购物车怎么展示价格变了以后购物车要不要实时刷新勾选状态放哪里数量更新是走 Redis 还是数据库下单时购物车快照怎么和真实商品校验联动也就是说购物车真正难的不是“存个列表”而是如何在体验、实时性、一致性和成本之间取平衡。二、购物车里到底要存什么我更建议购物车里只存用户 IDSKU ID数量勾选状态加入时间而这些内容通常不建议长期冗余存商品名称图片实时价格库存因为这些更适合在查询购物车时实时补齐。为什么因为商品名称会改图片会改价格会改活动价会变库存会变所以购物车更像“意向清单”不是订单快照。三、数据库和 Redis 怎么选3.1 Redis 适合什么适合高频读写未登录购物车用户临时态快速加购 / 改数量3.2 MySQL 适合什么适合登录用户购物车持久化存储跨端同步长期保存3.3 最常见的落地方式我更建议未登录购物车放 Redis / Cookie登录购物车最终落 MySQL热点读可配 Redis 缓存。如果系统体量不大也可以直接 MySQL 持久化 Redis 做热点加速四、推荐表结构CREATETABLEcart_item(idBIGINTPRIMARYKEYAUTO_INCREMENT,user_idBIGINTNOTNULL,sku_idBIGINTNOTNULL,quantityINTNOTNULL,selectedTINYINTNOTNULLDEFAULT1,created_atDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMP,updated_atDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,UNIQUEKEYuk_user_sku(user_id,sku_id));这个表设计的重点一个用户一个 SKU 只保留一条重复加购时直接改数量五、核心流程怎么设计5.1 加入购物车逻辑通常是如果购物车里没有该 SKU就插入如果有就累加数量5.2 修改数量逻辑通常是校验购买上限校验是否已下架更新数量5.3 勾选 / 取消勾选逻辑通常是更新selected5.4 查询购物车查询时通常要补齐商品标题图片当前售价是否下架是否缺货也就是说购物车展示数据通常是“购物车明细 商品快照实时补齐”的组合结果。5.5 提交订单提交订单时不能只相信购物车里原来的信息而必须重新校验商品是否可售数量是否足够当前价格是否变化六、最容易踩的坑6.1 把实时价格直接长期存购物车价格一变购物车就会和商品真实价格不一致。6.2 不做唯一键导致同一个 SKU 多条记录后面合并和计算会很麻烦。6.3 提交订单时直接信购物车价格这是非常危险的必须重新校验商品最新价格和库存。6.4 未登录购物车和登录购物车合并没设计好用户登录后很容易出现数量冲突重复商品勾选状态丢失七、面试中怎么回答如果面试官问你电商购物车一般怎么设计你可以这样回答第一购物车本质上更像用户的购买意向清单所以我通常只在购物车里存用户、SKU、数量、勾选状态这些稳定字段而不会把价格、库存等强实时字段长期固化在购物车表里。第二登录用户购物车我一般会落 MySQL 做持久化未登录购物车可以先放 Redis 或前端本地登录后再做合并。第三购物车查询时会实时补齐商品标题、图片、价格、库存状态等信息提交订单时再重新做一次商品可售、价格和库存校验而不会直接信任购物车中的历史数据。第四为了防止一个用户对同一个 SKU 出现多条记录购物车表通常会对user_id sku_id做唯一约束。八、总结购物车系统真正难的不是表结构而是如何平衡用户体验实时价格库存一致性跨端同步持久化成本如果只记一句结论我觉得可以记住这句购物车更适合存“用户想买什么”而不是长期保存“商品现在是什么样”下单时一定要重新校验商品真实状态。九、结尾如果你觉得这篇文章对你有帮助欢迎点赞、收藏、关注。后面我会继续整理一些更偏实战的 Java 后端和电商系统设计文章。

更多文章