很多团队把“库存系统优化”等同于“数据库性能优化”,这是我在过去七年帮零售、电商、医药和跨境企业做数据架构梳理时,踩得最深也最常见的一个坑。2022年夏天,我陪一家年营收过亿的直播电商客户复盘一次大促事故:数据库CPU被打满,Redis缓存穿透,订单表出现大量死锁,技术团队连夜扩容,结果第二天早上发现,真正的问题不是数据库扛不住,而是他们的库存模型根本没法适配“直播间一分半钟卖完五千件”这种脉冲流量。
那之后我意识到一个反常识的判断:库存动态调配的核心矛盾,不是并发写入有多快,而是业务策略能不能在正确的时间点,把正确数量的库存暴露给正确的用户群体。这篇文章会从数据库存场景优化的真实约束出发,拆解营销场景下的库存模型设计、动态调配策略、缓存一致性处理、熔断降级机制,以及一套可以照着落地的行动清单。
核心结论:数据库存优化的本质是“把业务节奏翻译成数据流转规则”
先说结论,方便你判断这篇文章值不值得继续读。我做了大量回访和压测之后,得到一条稳定经验:凡是把库存系统做成“一个库存数字+一个扣减接口”的团队,无论数据库用的是MySQL还是PG,无论缓存中间件多先进,在大促或直播场景下都会出事,区别只是早出事还是晚出事。而那些看起来“技术栈很朴素”却能平稳扛住高峰期的团队,普遍做了三件事:把库存从订单业务中独立出来建模;为不同营销场景配置不同的库存水位和释放策略;在数据一致性上明确取舍边界。
数据库存场景优化的目标应该是五个字:不错卖、不超卖、不积压、不拖垮、可追溯。这五个目标之间本身就存在矛盾,比如“不错卖”要求库存尽量多放,“不超卖”要求库存尽量收紧,两者在极端流量下是互斥的。所以真正的优化不是找到一个万能参数,而是建立一组可以随营销节奏切换的规则。
| 目标 | 业务含义 | 数据库层面的关键动作 |
|---|---|---|
| 不错卖 | 明明有货,但用户下单时报“库存不足” | 可卖库存水位保持冗余,避免缓存击穿导致误判 |
| 不超卖 | 用户下单成功,但仓库实际没有那么多货 | 扣减操作必须满足原子性和幂等性 |
| 不积压 | 活动结束后库存滞留在错误仓或错误渠道 | 预占释放、渠道间调拨要可配置 |
| 不拖垮 | 高峰时段数据库连接耗尽、接口雪崩 | 限流、排队、降级预案要提前设计 |
| 可追溯 | 出问题时能定位是谁、在哪个环节改了库存 | 库存流水表和版本号机制必不可少 |
在这五个目标之下,再看“动态调配”四个字,它的含义就清晰了:动态调配不是简单地写一个定时任务把A仓的库存挪到B仓,而是基于预设的营销规则,让库存状态在“物理库存,逻辑库存,锁定库存,释放库存”之间有序流转。数据库只是承载这场流转的载体。

我之所以把结论放在最前面,是因为很多人读技术文章习惯先看方案。但库存这个领域,方案永远依附于场景判断。你先记住一个核心判断:优先级排序是“业务策略→数据模型→技术选型→参数调优”,顺序不能反。
背景与真实场景:四种“库存风暴”长什么样
在展开技术方案之前,先讲清楚营销场景的多样性。绝大多数技术文章把“营销场景”等同于“大促秒杀”,这是最大的认知偏差。我做过的项目里,至少出现过四种完全不同的库存冲击模型,它们的流量特征、库存需求和数据库压力截然不同。
这类活动的特点是持续时间长(数小时到数天)、流量呈阶梯式上涨、库存参与范围广。它的本质是“可预见的持续高压”。数据库压力不是集中在某几秒,而是分布在多个整点。应对这类场景,重点在于“预计算”和“热点隔离”:把热门商品提前加载到缓存,把冷门商品的查询请求直接路由到只读库,避免所有流量都打到主库。库存扣减可以采用异步批量模式,先把扣减请求写入消息队列,再按批次合并扣减,降低数据库事务频次。
这是最危险的一种。2023年我参与过一家珠宝品牌的直播大促复盘,他们在主播喊出“上链接”后的90秒内涌入了12万次库存查询请求,最高峰每秒超过1300次扣减尝试,数据库连接池瞬间被打满。脉冲型流量的特征是“瞬时洪峰+短周期内结束”,对系统的考验不是平均性能,而是极限吞吐和快速恢复能力。应对方案必须包含前置限流:在网关层对同一用户的重复请求做折叠,对同一商品设置每秒最大扣减次数。
同时,库存扣减不能同步等待数据库返回结果,而应采用“预占+异步确认”的模式。
这类活动的流量峰值不高,但持续时间长,且状态变更极为频繁,用户可能反复加购、修改订单、取消订单、退款,导致库存状态在“锁定”和“释放”之间来回切换。它对数据库的挑战是“状态机复杂度”,而非并发量。我见过一个日化品牌,会员日三天内产生了超过40万次库存锁定变更,其中有效订单只有6万单,其余全是加购未支付和超时释放。如果每一次锁定释放都直接修改数据库行,锁竞争会非常严重。
此时应把“用户购物车有效时间”的默认值设置在一个合理的业务区间内,并让所有释放动作走统一的延迟队列,避免高频率的串行更新。
这是最容易出问题的场景,因为它同时涉及线上和线下两套库存体系。线上可卖库存、门店实时库存、在途调拨库存,三套数字之间存在时间延迟和口径差异。我服务过一家连锁烘焙品牌,他们遇到过的情况是:用户在线上成功下单了一块蛋糕并选择门店自提,但到店后门店店员告知没货。原因是线上系统和门店POS系统连接的是两套数据库,库存同步延迟达15分钟。这种场景的优化核心不是数据库性能,而是建立统一的库存视图:所有渠道的库存变更都汇聚到同一个库存中心,线下实时扣减通过API同步到线上,线上预占库存通过延迟队列释放给线下。
数据库层面则采用分布式锁和状态机,确保同一个物理库存不会被两个渠道同时扣减。

判断一个营销活动属于哪种“风暴”,有一个很实用的小经验:问三个问题,流量是持续的还是瞬时的?库存是单渠道还是多渠道?订单状态变更频率是高还是低?三个问题的答案组合,基本决定了库存系统是偏重“吞吐能力”还是偏重“状态管理能力”。我见过不少团队把“会员日”场景当作“秒杀”来设计,结果把系统搞得复杂无比,投入产出比极低。反过来,也有团队把直播秒杀当作普通“大促”来准备,结果没有前置限流,直接被打穿。
从数据观察来看,长期服务过的项目中,脉冲型场景占总营销活动数量的比例不到20%,但贡献了70%以上的数据库事故。这说明大部分团队对脉冲型流量的准备严重不足。

常见误区:为什么大家做的“库存优化”其实是在帮倒忙
在给客户做系统评估时,我总结了一批高频踩坑点。这些误区几乎每个团队都会踩一两个,而它们的方向恰恰与正确的库存优化背道而驰。
很多团队拿到问题后,第一反应是“加索引”“换SSD”“调连接池”。这些动作不是没有用,而是解决不了根本问题。库存系统的瓶颈往往在业务模型层:你的“可用库存”和“物理库存”是否混在一个表里?扣减逻辑是否依赖“先查后改”的非原子操作?库存在多个渠道间是否有清晰的口径?如果模型设计有缺陷,数据库调优只是在为一个错误的模型打补丁。我之前接手过一个跨境电商项目,他们的库存表里有“总库存”和“占用库存”两个字段,但实际查询“可卖库存”时,是拿“总库存”减去“占用库存”,在并发不高的情况下没问题,一旦流量上来就会出现严重的行锁竞争,两行数据的更新被反复阻塞。
优化方案不是调数据库,而是把库存变更改成“单向递增”的流水记录,可卖库存变成冗余字段,通过异步计算得出。
我理解业务方对超卖的零容忍,但“串行化扣减”是技术上的偷懒。把所有扣减请求排成一条队列,一个失败全部重试,确实可以做到不超卖,但代价是吞吐量断崖式下降。2021年我见过某鞋服品牌的系统,把所有扣减操作放在同一个事务里按顺序执行,正常日销没问题,双11当天接口响应时间从50ms直接飙到2300ms,用户大量流失。正确的思路是“分区并发、全局串行”:按商品维度分片,不同商品走不同线程池,同一商品内部用乐观锁或Lua脚本原子扣减,既保吞吐又防超卖。
很多团队喜欢用Redis做库存预热,把所有库存先加载到缓存,读请求全部走缓存。这个方案在“读多写少”的场景下有效,但营销场景恰恰是“读多写也多”。一旦扣减逻辑导致缓存与数据库不一致,就会出现缓存显示有货、下单后数据库没货的尴尬情况。缓存不是银弹,它是“读路径”的加速器,不能替代“写路径”的事务保障。更可怕的是,当缓存过期且热点key同时失效时,大量请求会直接穿透到数据库,导致数据库被击穿。
解决方法是给热点key设置不同的过期时间,并通过分布式锁或请求合并来保护数据库。
这是业务口径最常见的错误。很多系统的做法是:用户下单时直接扣减库存,订单超时未支付再返还库存。听起来合理,但实际运行中,“已下单未支付”的预占约束与“已支付待发货”的库存归属是两种截然不同的状态。如果下单即扣减,那么恶意刷单或大量加购不支付的用户会长期占用库存,导致真正想买的用户买不到。正确的模型应区分“预占库存”和“实际占用库存”:用户提交订单时预占库存,支付成功后预占转占用,超时未支付自动释放预占。
这个模型在数据库实现上并不复杂,关键在于状态机的设计。

库存系统最怕的不是出错,而是出错了查不到原因。不少团队的库存表只保留当前值,没有变更流水。一旦出现超卖或库存对不上账,只能靠人工翻日志,效率极低。任何库存优化方案都必须包含流水表和版本号机制。流水表用于记录每一次库存变更的时序、操作人、订单号和变更前值;版本号用于保证并发更新时的乐观锁控制。我在项目实施中有一条铁律:任何库存表如果缺少流水日志,我拒绝做进一步优化,因为这相当于在流沙上盖楼。
专业判断逻辑:动态调配的本质是“状态流转”而不是“数据搬运”
前面提到,库存状态是一个动态变化的系统,不是一个静态的数字。为了帮你建立完整的判断框架,我把它拆成几个核心概念。
库存动态调配的本质是五态流转。在这个模型中,每一笔库存变更都是从一个状态到另一个状态的迁移,而数据库的事务保证的是迁移的原子性。

在五态模型之上,动态调配需要处理两个层面的问题。首先是渠道间的调配:同一个物理库存,线上旗舰店、线下门店、分销商三个渠道怎么分?是按比例固定分配,还是按实时售罄率动态调整?其次是时间上的调配:活动前是否要锁定一部分库存?活动中库存售罄了是否允许超卖一部分(通过预售或补货)?活动结束后预占释放的库存如何回流到日常销售?这两个层面的调配逻辑,最终都会体现为数据库中的状态流转规则和定时任务。
在数据库层面,动态调配从来不是一条SQL能完成的。我常用的做法是封装成“库存服务”,对外提供四个原子接口:预占、确认、释放、调拨。每个接口内部通过事务脚本完成状态更新和流水记录。预占接口判断可卖库存是否充足,充足则扣减可卖、增加预占;确认接口在用户支付成功后把预占转成锁定或扣减;释放接口在超时或取消时把预占归还给可卖;调拨接口在两个渠道之间移动可卖额度,同时记录调拨流水。
这套模型具备“逻辑清晰、扩展容易、便于压测”的优点,并且天然适配未来引入分库分表或分布式事务。
一个可参考的伪代码示例(非具体语言)
function reserveInventory(productId, userId, orderId, quantity): 判断可卖库存是否充足 available = getAvailableInventory(productId) if available return false 原子操作: 减少可用库存, 增加预占库存 update inventory set available = available - ?quantity, reserved = reserved + ?quantity, version = version + 1 where product_id = ?productId and available >= ?quantity and version = ?oldVersion 写入库存流水表 insert into inventory_transaction (product_id, order_id, user_id, change_type, quantity) values (?, ?, ?, 'RESERVE', ?) return true
这套模型的关键在于“原子性”。update语句里的条件判断(available >= ?quantity)本身就是一种乐观锁保护,它保证在高并发下不会出现两个请求同时扣减同一份库存的情况。同时,流水表的写入和库存表的更新必须在同一个数据库事务里,避免出现库存被扣了但流水没记录的情况。
很多团队在“强一致”和“最终一致”之间反复纠结。我的判断是:库存扣减必须强一致,库存展示可以最终一致。用户点击“提交订单”时,系统必须保证不会扣减超过实际库存的量;但用户在浏览商品页时看到“仅剩5件”,这个数字允许有几秒钟的延迟。这一判断可以指导全局架构:扣减路径走强一致事务(数据库或Lua脚本),展示路径走弱一致缓存(Redis异步刷新),两者之间用消息队列解耦。

这个判断几乎适用于所有营销场景。唯一例外是O2O场景中的“门店自提”,因为用户在门店现场等着拿货,如果线上锁定库存和门店实际库存不一致,用户到店后货没了,体验极差。这种情况下,线上预占必须实时校验门店库存,并且锁定后不允许超卖。
具体案例与数据观察:三个项目的踩坑与复盘
经验如果只停留在方法论,就会变成鸡汤。这一节分享三个我亲手做过的项目,每个都踩了不同的坑,也代表了三种典型的优化路径。
2023年3月,客户找到我,说他们的直播间每次上新品都会导致系统卡顿,用户频繁反馈“下单失败”“库存明明显示有货但就是提交不了”。我看了他们的架构:MySQL单库单表,Redis只用来做商品信息缓存,库存扣减直接走数据库update语句。从数据库慢查询日志看,高峰期同一件商品的库存行要承受每秒400到700次update。由于每次update都需要行锁,大量请求堆积在锁等待上。
我们的优化动作分三步:第一步,把库存表从订单库中独立出来,单独建一个库存服务;第二步,引入Redis Lua脚本做原子扣减,利用单线程特性保证同一件商品的扣减不超卖;第三步,设置兜底异步任务,每5秒将Redis中的库存变化同步到MySQL,并在同步时检查一致性。优化后的压测结果是:库存接口吞吐量从每秒1120次提升到每秒9800次,P99响应时间从1800ms降为31ms。更重要的是,活动期间没有任何一笔超卖记录。
核心经验:脉冲型流量的第一道防线在“限流+预占”,第二道防线才在“数据库抗压”。Lua脚本本身帮我们挡下了80%的无效请求,数据库压力大幅缓解。

这个项目的痛点是“线上线下库存对不上账”。客户有300多家门店,每个门店有一个独立的POS系统,总部有一个中心库存系统。线上商城(小程序)接入的是中心库存系统,线下门店走的是POS系统。两边没有实时同步,导致用户在小程序上下单购买某药品后,总部下发给门店的配送指令可能失败,因为该门店的POS系统里显示无货。
我们做的核心改造是把库存模型从“单点库存”改造成“多级库存”:总部库存作为可调拨池,各门店库存作为履约池。线上订单先锁总部库存,然后根据用户选择的自提门店校验门店实时库存。门店库存通过实时接口同步到总部库存中心,每15分钟对账一次,差异超过阈值自动告警。这个方案的关键不是数据库性能,而是业务规则的重新设计。优化后,线上订单履约成功率从86.5%提升到98.7%,因库存数据不一致导致的资损减少了92%。
核心经验:O2O场景的库存优化首要解决“口径统一”,而非“速度提升”。先解决“数据对不对”的问题,再讨论“数据快不快”的问题。
这个项目很有意思,它是一个做精品家居的跨境独立站,主要市场在北美。问题在于库存分散在三个国家的海外仓,而用户流量相对集中在美国。如果美国仓缺货,用户只能看到“不可购买”,即使加拿大仓还有货,系统也不会自动调拨。他们一开始想通过人工方式每天手动调拨,但效率和准确率都很低。
我们设计了一套“动态调拨+预售熔断”规则:当美国仓的某一商品库存低于安全阈值且加拿大仓库存充足时,系统自动生成调拨推荐单,并通过流程自动化接口执行调拨,同时把该商品在前台的展示状态切换为“可预售”(下单后3到5天发货)。这背后涉及一个非常关键的技术判断:跨境库存动态调配不能天真地依赖“库存字段更新”,因为涉及真实物流成本和时间窗。所以我们在数据库层面增加了“调拨锁”:一件商品在调拨过程中,不允许再次被其他调拨任务锁定,避免出现多任务重复调拨同一批货源。
结果:整体库存滞销率下降了18%,售罄率从74%提升到89%,因为“预售模式”有效地把需求留在了站内。系统上线后连续运行三个销售季,没有发生过一次调拨冲突。

从我做过的项目看,可以大致把企业的库存系统成熟度分成四个阶段:手工Excel阶段、单库单表阶段、独立库存服务阶段、库存中台阶段。大部分年营收在5000万到5亿之间的企业,处于第二个阶段,他们能跑通业务,但经不起营销活动的冲击。如果企业平均每个月至少做一次直播或大促,我会强烈建议至少演进到第三阶段,独立库存服务。这不是为了追技术时髦,而是为了把“库存状态变化”从订单流程中剥离出来,使库存的增减不被订单事务的失败而回滚。
行动建议:不同预算、不同体量团队的落地路径
很多团队问我的第一句话是:“我们该不该上Redis?是不是要换数据库?是不是要引入分布式事务?”我的回答通常是:先别急着选技术,先选策略。下面是基于不同预算、不同团队规模、不同业务阶段给出的行动建议。
如果你的系统还处于单数据库、单仓库、日均订单量不足1000单的阶段,不要碰分布式事务,不要碰消息队列。你需要做的是三件事:第一,把库存表加上版本号,用乐观锁代替“先查后改”;第二,把“下单扣减库存”的逻辑改成“预占+超时释放”,避免大量无效占用;第三,在数据库里增加一张简单的库存流水表,每次变更都记录。这三项动作加起来不超过两天工作量,却能在活动来临时救你一命。
当日均订单量超过5000单,且业务同时覆盖线上、线下、分销时,你的问题不是技术性能,而是数据口径。此时最值得投入的是建立独立库存服务,统一所有渠道的库存变更入口。这个阶段不需要换数据库,也不需要微服务化,只需将库存相关逻辑从订单服务中剥离出来,做成一个独立的模块,提供原子接口。这个改造的效果会立竿见影:库存数据不再需要多渠道轮询同步,所有渠道看到的都是同一个真实库存。
如果你的业务已经频繁参与大促或直播,那么需要把“读路径”和“写路径”彻底分离。读路径走Redis缓存,写路径走数据库事务,两者通过消息队列异步同步。这里有几个关键参数供参考:库存缓存过期时间建议设为30秒到60秒,扣减接口的限流阈值建议按数据库承受能力的70%设置,释放未支付订单的定时任务建议每1分钟执行一次。同时,缓存更新应使用“删除缓存而非更新缓存”的策略,减少并发写冲突。
如果企业已经有多套业务系统、多个仓库、多个品牌,且仓储调度和营销活动频繁联动,那么独立库存服务已经不够用,需要走向“库存中台”的架构:包括实时库存服务、库存规划引擎、库存调度引擎、库存分析引擎四个部分。这个阶段的技术难度不在于数据库,而在于“规则引擎”的设计,比如调拨策略、安全水位、预售策略、渠道占比等,都需要可配置化。不少大企业在这个阶段引入“实时数据仓库”(如Doris或ClickHouse)来支撑库存分析,但我建议你先梳理清楚规则再引入组件,否则技术投入换不来业务效果。

最让我头疼的是那些只有活动前才想起来的团队。库存优化必须成为常态化机制,我建议每个月至少做一次“库存系统健康体检”:检查库存流水表是否有断档、Redis与MySQL的库存数据是否有偏差、未支付释放任务是否准时执行、历史活动参数是否需要调整。平时做好这些基础工作,活动来临时才能从容应对。
不同情况下的取舍:没有完美方案,只有局部最优解
这一节我想谈谈取舍。几乎每个库存优化决策都是“V字型”的,你得到一面,就会失去另一面。关键是你必须清楚自己当前最不能失去什么。
在极端营销流量下,为了保证系统不宕机,我们需要允许部分用户在高峰期看到“库存暂时不足”的提示,这就是在牺牲一致性换取可用性。取舍建议是:面向普通商品,优先保证可用性,展示“努力加载中”而不是报错;面向限量秒杀品,优先保证一致性,宁可显示“已抢光”也不能超卖。因为限量品的超卖会直接引起消费者投诉和品牌信任危机。
很多团队一听说Redis可以扛量,就立刻引入Redis集群。但他们没有意识到,Redis的高可用性需要额外的运维成本。如果你的业务一个月只有一次直播,投入大量精力做缓存架构可能不合算。取舍建议是:先算一笔账:一次大促事故带来的直接损失是多少?如果损失低于5万元,优化成本超过2万元,那不如先做业务层面的活动规则改良(如限制购买数量、启用预约制)。技术永远是服务业务的工具,不是目的。
把库存策略参数化(比如允许运营配置“预售比例”“秒杀库存阈值”)是很多团队的方向,但它会带来一个问题:运营同学可能误配置,导致超卖或滞销。取舍建议是:为参数配置设置操作审计和上线前模拟校验。在参数保存前,系统自动模拟历史流量并给出风险提示。这种方式既保留了灵活性,又控制了人为错误。
在库存状态变更如此频繁的场景下,每一次“实时下单即扣库存”都会带来巨大的写压力。如果你的业务不要求库存实时精准,可以选择“异步扣减”:用户下单后系统先锁定一部分可用名额,真正出库时再扣减实际库存。这种方式可以显著提升并发能力,但代价是库存精确性下降。取舍建议是:对核心爆品用实时扣减,对长尾商品用异步扣减,两者通过商品表上的一个“库存扣减模式”字段区分。
做了这么多项目,我最大的体会是:不追求完美的库存系统,只追求失控可控。这意味着:即使出现超卖,你也可以通过熔断机制及时止损;即使库存数据出现偏差,你也可以通过流水记录快速定位原因;即使系统被冲垮,你也可以通过降级页面保证用户基本体验。设计一个允许失控但能够快速恢复的系统,比设计一个理论上完美但实际无法运维的系统有价值得多。
现在,如果你读完这篇文章只记住一件事,我建议是这一件:库存动态调配的核心资产不是数据库,而是你为库存状态设计的流转规则。规则清晰,架构自然清晰;规则混乱,再先进的数据库也只是加速器,帮你更快地走向崩溃。下一步,建议你先拉上业务同事,按照文中的四种营销场景,分别画出你当前系统的库存状态流转图。一天时间就能完成,做完你会更清楚自己的系统到底在哪一层。
我做过五年零售行业的数据架构,可以明确告诉你:传统ERP库存和营销场景库存,表面看都是'进销存',但底层是两套完全不同的建模逻辑。用一句话说透:ERP管的是'仓库里有什么',营销库存管的是'用户能买到什么'。这个区别在动态调配场景下会被急剧放大。
这个问题我非常有发言权。去年我帮一家连锁餐饮企业诊断过类似问题,他们上线库存中台后,线上团购券和门店自提经常对不上账。最后排查下来,根源不是技术bug,而是'库存状态定义'在业务流转中发生了混乱。你的问题核心在于:把'物理库存'和'可卖库存'混为一谈,且在多个状态之间缺少明确的流转阀门。
我的经验是:谁要告诉你一套方案通吃所有营销场景,你可以直接把他拉黑。这是我在某头部化妆品品牌做复盘时得到的血泪教训。他们当时的做法就是用一套'通用秒杀架构'来承接会员日满减活动,结果数据库连接池被打满,导致普通用户的加购请求大面积超时。
这是一个特别好的问题。绝大多数团队在评估库存优化效果时,只看'系统不崩了'这种技术指标。但这恰恰掉进了陷阱:能扛住流量,不代表你'适配了营销场景'。我给你的建议是:搭建一套三层评估模型,从技术、业务和资金三个维度来做复盘。


读者评论
文章把库存优化的核心从数据库性能拉回到了业务策略层面,这个角度很实在。尤其是“不错卖和不超卖本身互斥”这一点,很多团队确实没想清楚,最后用技术方案硬扛,结果两边都做不好。
看了四种库存风暴的划分,对照我们自己的系统,发现一直在用应对节奏型大促的思路去处理直播秒杀,难怪每次脉冲流量一来就告警。文章里只占20%的活动却贡献了70%的故障,这个数据很扎心。
最认同的是“把库存从订单业务中独立出来建模”这个观点。我们之前就是总库存减占用库存的写法,行锁竞争严重,改成流水记录后清爽很多。数据库调优确实是在为错误的模型打补丁,方向错了再优化也是白费。
O2O那个案例简直就是我们公司的翻版,线上线下两套库存,同步延迟十五分钟,用户到店取货扑空的投诉太多了。文章说核心不是数据库性能而是统一库存视图,这个建议值得好好琢磨,光靠加缓存解决不了这种一致性问题。