此篇文章来自于京东大神开涛的微信公众号中的内容,感谢开涛大神,慢慢的干活,地址如下:
https://mp.weixin.qq.com/s/-9fvfJ6KT3xSRQZnlTBBhA
多人同时购买1件商品,如何安全地扣减库存呢?
(现实中同一件商品可能会出现多人同时购买的情况,我们可以如何做到并发安全呢?)
1、伪代码片段1:
伪代码片段1的设计思想是所有请求过来之后首先去加锁,强制其串行化处理,可见其效率一般不是很高,
为代码片段2:
这段代码只是在where条件里面增加了and stockNum >= " + requestBuyNum 即可防止超卖的行为,达到了与上述伪代码1的功能
如果该商品是促销商品(比如参与了秒杀的商品)并发扣减的几率会更高,那么数据库的压力会更高,这个时候应该怎么去做呢?
海量的用户秒杀请求,本质上是一个排序,先到先得,但是如此多的请求,注定了有些人是抢不到的,可以在进入上述伪代码Dao层之前增加一个计数器进行控制,比如有50%的流量将直接告诉其抢购失败,伪代码如下所示:
另外同一个用户,不允许多次抢购同一件商品,我们又该如何去设计呢?
如果同一个用户拥有不同的账号,来抢购同一件商品,上面的策略就失效了。
一些公司在发展早期几乎是没有限制的,很容易就可以注册多个账号。也就是网络所谓的“僵尸”账号,数量庞大,如果我们使用几万个僵尸号去混进去抢购,这样就可以大大提升我们中奖的概率,那我们应该如何去应对呢?(用IP去限制,每个IP只能去参与一次抢购,这样就避免了一个IP下的多个“僵尸”号去抢购同一个商品)
另外将库存系统的核心表结构设计提供出来供大家参考
库存主表,命名规则:stock_center_00~99
库存流水表,命名规则:stock_center_flow_00~99
库存批量操作日志表,命名规则:batch_upload_log
网友评论