第378章【解决方案与报价】

,虽然服务端可以限制ip和用户的购买订单数量,但这也真心不算是一个好办法。”

“然后就是支付减库存了。如果等待用户支付了订单再减库存,第一感觉就是不会少卖。但这是并发架构的大忌,因为在极限并发的情况下,用户可能会创建很多订单,当库存减为零的时候很多用户会发现抢到的订单支付不了,这也就是所谓的‘超卖’,也不能避免并发操作数据库磁盘io。”

“最后是预扣库存。从上面两种方案的考虑,可以得出结论:只要创建订单,就要频繁操作数据库io。那么有没有一种不需要直接操作数据库io的解决方案呢?答案是有,就是预扣库存,先扣除了库存,保证不超卖,然后异步生成用户订单,这样响应给用户的速度会快很多。”

“那么怎么保证不少卖呢?用户拿到了订单,不支付怎么办?订单都应该有效期,比如说用户五分钟内不支付,订单就失效,就会加入新的库存。订单的生成是异步的,应该放到即时消费队列中处理……”

刘副总听的云里雾里的,但是他发现罗晟和他带来的几个技术专家交流的愈发火热,似乎也得出了一个信息。

找对人了!

这时,罗晟打开了房间里的墙面上的大屏幕,他也拿来了一台笔记本工作电脑打开,示意众人看向主投屏,自己一边操作电脑一边说道:

“go语言原生为并发设计,我就采用go语言给各位演示一下单机抢票的具体流程以及我优化后的解决方案。”

“go包中的init函数先于main函数执行,也在这个阶段主要做一些准备性质的工作。系统需要做的准备工作有:初始化本地库存、初始化远程redis存储统一库存的hash键值、初始化redis链接池。”

“另外还需要初始化一个大小为1的int类型,目的是实现分布式锁的功能,也可以直接使用读写锁或者使用redis等其他方式避免资源竞争,但是使用el更加高效,这就是go语言的哲学,不需要通过共享内存来通信,而是通过通信来共享内存。redis库使用的是redigo,下面是代码:

//localspike包结构体定义

packagelocalspike

typelocalspikestruct{

lostot64

loeint64

//remotespike对hash结构的定义和redis连接池

packageremotespike

相关阅读: 我的卡牌可以无限合成我能穿越万界诸天快穿我的万宝阁重生团宠:影帝夫人又穷又凶三宝大战酷爹地李安安褚逸辰斗罗之别等我CD转好黄粱一梦之我是小桃我家有玄门大佬虎啸都市陈飞云冷雯从木叶七年开始交换身体末世大佬忙种田一粒沙子的鸣响总裁是个宠妻狂宋星辰慕霆萧总裁的千亿豪妻宋星辰慕霆萧慕少独宠重生妻宋星辰慕霆萧洪荒:真地仙之祖千亿盛宠:慕少的神秘小妻宋星辰慕霆萧重生:学霸女友太严了怎么办霍格沃兹之我的同学是伏地魔我成了异界强者李凡慕千凝