买杀是现在很常见的应用场景,主要有两个问题需要解决:
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调用接口。
再比如上面的会导致一个用户抢不止一个,心想:
需要一个队列,一个抢购结果队列和一个库存队列。在高并发的情况下,首先将用户放入队列,通过一个线程循环处理将一个用户从队列中取出,判断用户是否抢购了结果队列,如果是,则已抢购,否则不抢购库存,写入数据库,将用户放入结果队列。
测试数据表
对编程感兴趣,想了解更多编程知识,关注头条号,一起玩编程
更多编程资讯,干货不断更新~








