今天去面试,被问到一个问题,【秒杀】是如何来实现的?
秒杀的主要问题就是别卖超了,因为应用服务器有多台,所以synchronized肯定是不行的,直接访问DB肯定更不行了,那就只能是使用memcache或者redis之类来实现。
有知道细节的没?
------解决方案--------------------刚一听,觉得是一个简单问题,然后一看楼主说服务器有多台,瞬间感觉不知道了
------解决方案--------------------多台服务器用中间数据库来同步
------解决方案--------------------
memcache存成个list,index超出的部分返回错误值?或者不put?
------解决方案--------------------应该是同步调用一台数据库,切相应速度很快,否则会出现误差
------解决方案--------------------http://www.iteye.com/topic/1119017?page=1
这里有一些关于秒杀的讨论,可以参考一下。
------解决方案--------------------多台服务器,数据共享。memcache当然行了。
其实数据库也行,就是效率太低,不太实用:你把相应的记录锁住或者把表锁了,就可以实现了。
------解决方案--------------------技术方面就不多说了。。
但是实际上商家真正的操作上面用的不是啥高明的技术,而是登陆库存的时候就已经减了一定数量的库存来保证不超卖了。
------解决方案--------------------没接触过 学习一下
------解决方案--------------------直接用db我觉得可以啊,update时指明剩余数量要大于0,如果update返回1+则说明抢到了,返回0则说明没抢到,即便在update之前想做一些check那可以开事务然后select for update加个锁
------解决方案--------------------------解决方案--------------------为什么都要想到数据端呢?
考虑程序端解决啊,调用同一个接口,形成队列,然后处理队列的Index就OK了!
------解决方案--------------------真心不懂,学习一下
------解决方案--------------------
学习啦
------解决方案--------------------
正解!
------解决方案--------------------我们做的秒杀直接就是对DB操作的。
------解决方案--------------------学习中
------解决方案--------------------秒杀是土豪干的事
------解决方案--------------------如果你秒杀过商品你应该能感觉出来,其实即使是多服务器那么肯定也有个中心处理的服务器,你访问的服务器会把你的请求提交到同一的处理服务器来进行处理,所以会出现点击秒杀后提示正在提交,结果说秒杀已经结束。
------解决方案--------------------可以使用memcache将秒杀产品读入存储 每次秒杀通过MQ操作 有序进行 逐个递减