news 2026/9/29 4:29:15

同城电商系统:库存变更怎么同步到订单

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
同城电商系统:库存变更怎么同步到订单

同城电商系统库存变更若不同步到订单占用层,会出现「后台显示有货、实际已被未支付单占满」。宜库存 = 物理量 - 占用量;占用在下单创建,支付成功转实扣,超时释放。

模型

sku_stock: on_hand sku_hold: sum(active holds) available = on_hand - sku_hold

下单预占

defcreate_order(lines):withstock.lock(sku_ids(lines)):forlineinlines:ifavailable(line.sku_id)<line.qty:raiseOutOfStock(line.sku_id)hold_repo.insert(line.sku_id,line.qty,order_id,ttl=900)returnorder_repo.insert(...)

支付成功

defon_paid(order_id):forhinhold_repo.by_order(order_id):stock_repo.decrement(h.sku_id,h.qty)hold_repo.release(h.id)

改库存

defadjust_on_hand(sku_id,delta):stock_repo.adjust(sku_id,delta)# 不回写已存在 hold;available 自动重算

验收

未支付单占满时,新单拒绝;改 on_hand 不影响已支付单 line snapshot;超时 hold 释放。

光合同城边界

光合同城同城电商成品含库存占用逻辑;可按业务定制;商务规则由客户确定。

小结

同城电商系统库存变更通过占用层同步到可售量,订单行 snapshot 保历史一致。

超时释放 hold

defrelease_expired_holds():forhinhold_repo.expired(before=now()-900):hold_repo.release(h.id)# on_hand 不变,available 自动回升

定时任务每分钟跑;监控 expired 释放失败数。

并发扣减

行锁SELECT ... FOR UPDATE或 Redis 预减 + 异步落库;切忌读 available 后无锁写 hold。

与订单取消

defcancel_unpaid(order_id):order_repo.cancel(order_id)hold_repo.release_by_order(order_id)

压测指标

单 SKU 1000 QPS 下单,观察 hold 表行数与 available;不应出现 available 长期为负。

光合同城

同城电商成品含占用逻辑;可按促销规则定制;商务规则由客户确定。

小结

同城电商系统库存变更同步到占用层,配合 snapshot 与超时释放,是可售量与历史单一致的双保险。

秒杀与热点 SKU

热点 SKU 可 Redis 预减 + 异步写 hold;MySQL 为最终真相,定时对账 Redis 与 hold 表。

defflash_hold(sku_id,qty):ifnotredis_decr(sku_id,qty):raiseOutOfStock()queue.publish({"sku_id":sku_id,"qty":qty,"order_id":...})

订单行 snapshot 字段

order_line={"sku_id":sku.id,"title":sku.title,"unit_price":sku.price,"qty":line.qty,"stock_version":sku.version,}

改库存不 retroactive 改 line。

监控

hold_expired_total、oversell_alert、redis_db_drift分指标告警。

小结补述

同城电商系统库存变更 → 占用 → snapshot 三层分工,促销高峰靠预减与异步,平时靠行锁即可。

上线前压测清单

单 SKU 500 QPS 预减 5 分钟;MySQL hold 与 Redis 偏差 <0.1%;超时 release 任务延迟 <60s。三项通过后,再对外开大促入口,避免「活动一开就超卖」集中暴露架构短板。

促销前清过期占用

同城电商系统大促前若不清过期占用,会出现后台显示还有货、实际已被未支付单占满。下单预占、支付成功实扣、超时释放,三层缺一层就会超卖或误拒单。改库存只动物理量,不回写已存在占用;可售量等于物理量减占用量,自动重算。

热点商品可用 Redis 预减加异步写占用,数据库为最终真相,定时对比 Redis 与占用表偏差。订单行写入下单时商品标题、单价、数量快照,改库存不 retroactive 改历史行。压测单 SKU 高并发下单,观察占用表行数与可售量,不应长期为负。三项压测通过再开大促入口。
秒杀场景 Redis 预减失败应快速拒绝,异步 worker 写占用失败进死信队列补写。订单行带库存版本字段,改库存不 retroactive 改历史行,纠纷时导出订单行是最硬证据。

超卖与拒单都源于占用层缺失

未支付单占满库存时新单应拒绝;改物理库存不影响已支付单快照。超时释放任务每分钟跑,监控 expired 释放失败数。热点 SKU 可 Redis 预减加异步写占用,数据库为最终真相,大促后全量对账一次。订单行写入下单时标题、单价、数量快照,改库存不 retroactive 改历史行;纠纷时导出订单行是最硬证据,商家履约也以快照为准。压测单 SKU 高并发下单,观察占用表与可售量,不应长期为负。Worker 写占用失败进死信队列补写,Redis 预减与 MySQL 最终一致,对账以数据库为准。大促后宜全量对账一次。交付宜附压测报告与死信补写流程说明。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 4:25:46

hindsight浏览器历史取证实战:从SQLite碎片还原行为时间线

最近接了一个数据审计的活儿&#xff0c;客户拿了一台旧笔记本过来&#xff0c;说想搞清楚某天晚上这台设备到底访问了哪些网站、下载过什么文件、登录过哪些账号。设备早就关了机&#xff0c;现场也早就收拾干净了&#xff0c;唯一的线索就是浏览器里残留的那些数据库文件。这…

作者头像 李华
网站建设 2026/9/29 4:25:39

Keil C51和MDK-ARM共存:51与STM32双平台开发环境搭建全攻略

直接上干货&#xff0c;不兜圈子。这篇写给那些手边同时摆着51开发板和STM32开发板的人&#xff0c;也就是我踩过一遍坑的地方。先说结论&#xff1a;Keil C51和Keil MDK-ARM不是同一个软件的两个版本&#xff0c;而是两套完全独立的工具链&#xff0c;只是共用了一个名叫Visio…

作者头像 李华
网站建设 2026/9/29 4:25:24

双馈风机虚拟惯性控制:原理、建模与Simulink仿真实践

做双馈风机虚拟惯性控制这事&#xff0c;得先把一个非常反直觉的事实摆出来&#xff1a;风机的转速和电网频率&#xff0c;在物理上本来一点关系都没有。风机转多快&#xff0c;取决于风有多大&#xff0c;而电网频率取决于整个系统发电和用电的平衡。但是电力系统调度又特别希…

作者头像 李华
网站建设 2026/9/29 4:24:55

5个免费Linux学习网站:从入门到命令行的进阶路线

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华