更新时间:2019年07月26日 11时11分32秒 来源:黑马程序员论坛
各位小宝贝们,大家是不是在面试过程中经常被问到,你电商项目扣减库存时,到底是下单减库存呢?还是付款减库存? 那今天给大家出几种解决方案,有不对的地方欢迎批评指正!! 一、扣减库存的三种方案 (1)下单减库存 用户下单时减库存 优点:实时减库存,避免付款时因库存不足减库存的问题 缺点:恶意买家大量下单,将库存用完,但是不付款,真正想买的人买不到 (2)付款减库存 下单页面显示最新的库存,下单时不会立即减库存,而是等到支付时才会减库存。 优点:防止恶意买家大量下单用光库存,避免下单减库存的缺点 缺点:下单页面显示的库存数可能不是最新的库存数,而库存数用完后,下单页面的库存数没有刷新,出现下单数超过库存数,若支付的订单数超过库存数,则会出现支付失败。 (3)预扣库存 下单页面显示最新的库存,下单后保留这个库存一段时间(比如10分钟),超过保留时间后,库存释放。若保留时间过后再支付,如果没有库存,则支付失败。例如:要求30分钟内支付订单。 优点:结合下单减库存的优点,实时减库存,且缓解恶意买家大量下单的问题,保留时间内未支付,则释放库存。 缺点:保留时间内,恶意买家大量下单将库存用完。并发量很高的时候,依然会出现下单数超过库存数。 二、如何解决恶意买家下单的问题 这里的恶意买家指短时间内大量下单,将库存用完的买家。 (1)限制用户下单数量 优点:限制恶意买家下单 缺点:用户想要多买几件,被限制了,会降低销售量 (2)标识恶意买家 优点:卖家设定一个备用库存,当支付时,库存已用完,扣减备用库存数,这就是常见的补货场景 缺点:因高并发场景下,数据可能存在不一致性的问题 三、如何解决下单成功而支付失败(库存不足)的问题 (1)备用库存 商品库存用完后,如果还有用户支付,直接扣减备用库存。 优点:缓解部分用户支付失败的问题 缺点:备用库存只能缓解问题,不能从根本上解决问题。另外备用库存针对普通商品可以,针对特殊商品这种库存少的,备用库存量也不会很大,还是会出现大量用户下单成功却因库存不足而支付失败的问题。 四、如何解决高并发下库存超卖的场景 库存超卖最简单的解释就是多成交了订单而发不了货。 场景: 用户A和B成功下单,在支付时扣减库存,当前库存数为10。因A和B查询库存时,都还有库存数,所以A和B都可以付款。 A和B同时支付,A和B支付完成后,可以看做两个请求回调后台系统扣减库存,有两个线程处理请求,两个线程查询出来的库存数 inventory=10, 然后A线程更新最终库存数 lastInventory=inventory - 1 = 9, B线程更新库存数 lastInventory=inventory - 1 = 9。 而实际最终的库存应是8才对,这样就出现库存超卖的情况,而发不出货。 那如何解决库存超卖的情况呢? 1.SQL语句更新库存时,如果扣减库存后,库存数为负数,直接抛异常,利用事务的原子性进行自动回滚。 2.利用SQL语句更新库存,防止库存为负数 1. UPDATE [库存表] SET 库存数 - 1 WHERE 库存数 - 1 > 0 2. 3. 如果影响条数大于1,则表示扣减库存成功,否则订单失败,并退款。 五、秒杀场景下如何扣减库存 (1)下单减库存 因秒杀场景下,大部分用户都是想直接购买商品的,可以直接用下单减库存。 大量用户和恶意用户都是同时进行的,区别是正常用户会直接购买商品,恶意用户虽然在竞争抢购的名额,但是获取到的资格和普通用户一样,所以下单减库存在秒杀场景下,恶意用户下单并不能造成之前说的缺点。 而且下单直接扣减库存,这个方案更简单,在第一步就扣减库存了。 (2)将库存放到redis缓存中 查询缓存要比查询数据库快,所以将库存数放在缓存中,直接在缓存中扣减库存。然后在通过MQ异步完成数据库处理。 (3)使用量自增方式 可以先增加已使用量,然后与设定的库存进行比较,如果超出,则将使用量减回去。 项目中用到了很多机制,但是没有总结出来,学习架构需要不断地总结。 |
推荐了解热门学科
java培训 | Python人工智能 | Web前端培训 | PHP培训 |
区块链培训 | 影视制作培训 | C++培训 | 产品经理培训 |
UI设计培训 | 新媒体培训 | 产品经理培训 | Linux运维 |
大数据培训 | 智能机器人软件开发 |
传智播客是一家致力于培养高素质软件开发人才的科技公司,“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。
传智播客从未停止思考
传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”
中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。
何为中高级程序员课程?
传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展。“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。
黑马程序员热门视频教程【点击播放】
Python入门教程完整版(懂中文就能学会) | 零起点打开Java世界的大门 |
C++| 匠心之作 从0到1入门学编程 | PHP|零基础入门开发者编程核心技术 |
Web前端入门教程_Web前端html+css+JavaScript | 软件测试入门到精通 |