商品库存管理和秒杀系统设计(19/100)
商品库存管理和秒杀系统设计
在电商系统中扣减库存是一步非常关键的操作,例如秒杀系统中一定要防止超卖情况出现,如果商家设置了 100 件库存但是最后卖出 1000 件,这样就会产生资金损失。
以下内容参考了十来篇技术文章,汇总了不同的设计方案。仅供参考。
基于不同底层技术的四种扣减方案
通过 MySQL 乐观锁扣减库存[1]
通过 Redis 在缓存扣减库存[2]
查询缓存要比查询数据库快,所以将库存数放在缓存中,直接在缓存中扣减库存。如果并发很高,还可以采取分布式锁的方案
基于数据库+缓存的热点扣减库存[3]
缓存虽然可以保证不会超卖,但是由于纯缓存方案不具备事务性,在极端情况下,存在缓存的数据无法回滚。因此结合缓存扣减更新库存保证性能,而利用数据库的事务特性来保证数据的最终一致性,和纯数据库方案不一样的地方在于,数据库只做插入,不做更新
Redis + MQ + MySQL 保证库存安全,满足高并发处理[4]
利用 Redis increment 的原子操作,保证库存安全,利用 MQ 保证高并发响应时间。但是事需要把库存的信息保存到 Redis,并保证 Redis 和 Mysql 数据同步。缺点是 redis 宕机后不能下单。 increment 是个原子操作。
其它参考资料
Redis 架构实战:高并发情况下并发扣减库存[5] *****
优惠劵系统库存设计浅谈[6]
基于不同业务阶段的库存扣减的方案对比
参考来源: 浅析「扣减库存」的方案设计[7]
6 种库存超限的处理方案
参考来源: 你所不知道的库存超限做法[8]
基于 MQ 的商品库存扣减方案
创建订单时预占库存,预占成功,则进行订单创建。 用户支付成功后,发送扣减库存消息到 MQ,库存服务进行库存真正扣减; 订单取消,发送释放库存消息到 MQ,库存服务释放库存。
参考来源: 库存扣减方案[9]
结合数据库和 Redis 的高并发扣减方案
扣减库存其实包含两个过程:第一步是超卖校验,第二步是扣减数据的持久化;在传统数据库扣减中,两步是一起完成的。抗写的实现原理其实是巧妙的利用了分离的思想,分离开防超卖和数据持久化;首先防超卖是由 Redis 来完成的;通过 Redis 防超卖后,只要落库就可以;落库通过任务引擎,业务数据库使用商品分库分表,任务引擎任务通过单据号分库分表,热点商品的落库会被状态机分散开,消除热点。
原文提供了非常详细的方案设计,包括流程图,架构图,原理图和注意点等。可以阅读原文获取更多信息。
参考来源: 电商库存系统的防超卖和高并发扣减方案[10]
秒杀系统设计
其它参考资料
浅谈秒杀系统架构设计[11]
参考资料
[1]
MySQL 乐观锁扣减库存原理图解: https://juejin.cn/post/7046905194512121886
[2]
浅析「扣减库存」的方案设计: https://juejin.cn/post/6969964751619112996
[3]
23 讲搞定后台架构实战学习-扣减秒杀场景: https://juejin.cn/post/6964337427565510669
[4]
这个是真的厉害,高并发场景下的订单和库存处理方案,讲的很详细了!: https://juejin.cn/post/6850037282246754318
[5]
Redis 架构实战:高并发情况下并发扣减库存: https://juejin.cn/post/6995481370269057032
[6]
优惠劵系统库存设计浅谈: https://juejin.cn/post/6844903782191480840
[7]
浅析「扣减库存」的方案设计: https://juejin.cn/post/6969964751619112996
[8]
你所不知道的库存超限做法: https://juejin.cn/post/6844903751661125646
[9]
库存扣减方案: https://juejin.cn/post/6858815974515818503
[10]
电商库存系统的防超卖和高并发扣减方案: https://juejin.cn/post/7023369492159791118
[11]
浅谈秒杀系统架构设计: https://juejin.cn/post/6844903448278728711
版权声明: 本文为 InfoQ 作者【hackstoic】的原创文章。
原文链接:【http://xie.infoq.cn/article/d70abaebdc1db54681a741729】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论