秒杀程序数据库设计

        上个月有幸去腾讯逛了一圈,面试一个职位,尽管没被录取但是过程总体来说仍是愉快的。面试过程当中面试个人小朋友(看年龄大概在26,7岁)问了我一个关于秒杀的问题,他说腾讯游戏经常会有秒杀的活动,很是屡次会致使server死锁或压力太大,应该怎样设计减轻数据库server压力。固然因为面试的是PHP职位,我作的是C#和JAVA我知道应该没机会因此本不想太过“配合”的回答,但是看面试个人小朋友看我好像很是不削的样子(可能因为面试的是PHP职位而且一上来就让我作题目,尽管我有点不情愿作题但是毕竟是腾讯仍是作了但是PHP接触的真的很少因此题目差点儿是连蒙带猜的完毕的,预计不是很是好看),因此仍是认真想了想解决方式。前端

        秒杀说究竟就是瞬间大规模訪问,致使的压力,前端咱们可以使用集群技术,数据库呢?拆表?是个方法,但是假设仅仅是简单拆表仍然会有问题,毕竟秒杀商品被记录到表中后用户秒杀必然是需要经过改动表中已有的秒杀商品记录来肯定这个商品是否已经被秒走。为了防止抢到同一条记录加锁是必须。而数据库一锁性能问题就来了。那怎么办呢?我想了一个方法(至少有一点可以肯定腾讯游戏没实用这种方法解决),秒杀时并不是立马去改动数据库中记录(进行update操做),而是先向一张表中插入一条记录,相似进入等待队列,为了防止大规模插入操做致使锁表咱们可以将队列表拆成多张一样结构表。有一个job会不断读取这些队列表并依照插入时间排列计算那些记录被秒杀成功。而client在点击秒杀button后断开链接,几秒后再次经过查询语句来查询结果,并返回给前台客户。面试

         这样作的优势秒杀过程是分段的,前台用户在秒杀时仅是向(多张队列表中)某一张队列表中插入一条记录,以后便断开本次链接进入等待,job程序经过合并查询将多张秒杀表合并按插入时间排序,按规则得出秒杀成功的用户并改动秒杀商品表,代表此商品已被秒杀,前台程序在等待几秒后查询秒杀商品表得到本身是否已秒杀成功。数据库

         因为第一步仅仅是插入操做,无需操心同步操做带来的脏数据问题,因此咱们可以经过拆表来分散压力减小隔离等级。更新操做是有一个单独的job程序完毕的,因为仅仅有一个程序会去改记录因此就不存在锁表问题。最后前台经过查询语句来获取结果,因为查询商品秒杀结果也不需要不论什么的顺序仅仅需要知道是否是你本身抢到的就好,因此可以使用with(nolock)一类的忽略锁机制来运行。性能

相关文章
相关标签/搜索