淘宝如何抢购秒杀(淘宝、京东等抢购、秒杀功能,原来是这样实现的)



买杀是现在很常见的应用场景,主要有两个问题需要解决:

1数据库的高并发压力

2竞争状态下如何解决正确的库存减少(“超卖”问题)

对于第一个问题,很容易想到用缓存来处理抓拍,避免直接操作数据库,比如用redis。

重点看第二个问题。

一般写作:

找出对应商品的库存,看是否大于0,然后进行生成订单等操作。但在判断库存是否大于0时,如果在高并发下出现问题,库存就会为负。



优化方案一:将库存字段的数字字段设置为无符号。当库存为0时,将返回false,因为该字段不能为负。



优化方案二:使用mysql的事务锁定操作行。



优化方案三:使用非阻塞文件独占锁。



优化方案四:使用redis队列,因为pop操作是原子性的,即使多个用户同时到达,也是依次执行,建议使用(mysql事务在高并发下性能大幅下降,文件锁定方式也是如此)

淘宝秒杀怎么抢

首先将商品作为队列进行盘点。



购买和描述逻辑



模拟5000高并发测试

web bench-c 5000-t 60 http://192 . 168 . 1 . 198/big/index . PHP

a b-r-n 6000-c 5000 http://192 . 168 . 1 . 198/big/index . PHP

只是上面的高并发下抢购的简单模拟。真实场景比这复杂多了,注意点也很多。

如果抓取的页面是静态的,通过ajax调用接口。

再比如上面的会导致一个用户抢不止一个,心想:

需要一个队列,一个抢购结果队列和一个库存队列。在高并发的情况下,首先将用户放入队列,通过一个线程循环处理将一个用户从队列中取出,判断用户是否抢购了结果队列,如果是,则已抢购,否则不抢购库存,写入数据库,将用户放入结果队列。

测试数据表











对编程感兴趣,想了解更多编程知识,关注头条号,一起玩编程

更多编程资讯,干货不断更新~

您可以还会对下面的文章感兴趣

使用微信扫描二维码后

点击右上角发送给好友