秒杀程序数据库设计

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

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

这样做的优点秒杀过程是分段的,前台用户在秒杀时仅是向(多张队列表中)某一张队列表中插入一条记录,之后便断开本次连接进入等待,job程序通过合并查询将多张秒杀表合并按插入时间排序,按规则得出秒杀成功的用户并改动秒杀商品表,表明此商品已被秒杀,前台程序在等待几秒后查询秒杀商品表获得自己是否已秒杀成功。

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

时间: 2024-11-05 02:34:56

秒杀程序数据库设计的相关文章

医生智能提醒小程序数据库设计心得——Legends Never Die

根据我们小组数据库设计的整个流程,我们将整个数据库设计划分为两个具体的阶段,在每个阶段需要进行不同的准备,有不同的注意事项,接下来我们将结合在数据库设计过程中遇到的一些问题和困难,提出自己的一些观点,希望能对大家有所启发.如有异议,欢迎指正. 一.准备阶段: 在数据库设计前,需要准备以下几样东西: 1:设计工具 数据库设计过程中会用到一些软件,例如powerdesigner(实际上不仅仅是用于数据库设计).想要设计好数据库,熟练运用软件是必不可少的.至于如何学习使用其进行数据库设计,主要的方法还

MVC之排球比赛计分程序 ——(一)需求分析与数据库设计

在实际的项目中,需求分析和数据库的设计是很重要的一个环节,这个环节会直接影响项目的开发过程和质量.实际中,这个环节不但需要系统分析师.软件工程师等计算机方面的专家,还需要相关领域的领域专家参与才能完成. 需求分析: 这个项目是一个排球比赛计分程序,其业务极为简单,现将其描述如下. 1.任何观众都可以进行比赛的分数查询,查询完成后,页面上显示查询的相应的比赛内容. 2.任何观众都不可以对分数进行增删改查. 3.记分员可以对比赛进行实时记录,并将分数记录在数据库,方便观众查询,以及对分数进行通过操作

最老程序员创业开发实训14---PHP---用户体系数据库设计

在做完了之前的一系列工作之后,终于要进行应用后台的设计和实现环节了.在后台设计中,我们觉得数据库的设计是最重要的根基,因为所有业务逻辑均是架构在数据库的基础之止,如果对数据库进行修改,程序可能需要大改,工作量将非常之大,所以数据库设计必须非常重视. 在谈数据库设计之前,我们先谈一下ORM,即关系数据库与面向对象系统的映射,其理由是面向对象开发人员,不了解关系型数据库,因些引入ORM,使其不需要学习关系型数据库就可以进行数据库开发.我们认为,关系型数据已经有了几十年的发展历史,理论和实践都很成熟,

高并发下的系统设计(偏数据库设计)

高并发完毕数据库设计是要结合不同的应用场景的,本文主要涉及到一下问题: 1.对数据库表的字段訪问比較均衡,业务导向明显(网上商城,多条业务线): 2.对数据库表的字段訪问比較均衡,业务导向不明显(对单一应用的高并发訪问): 3.对数据库表的单一字段訪问比較集中(秒杀.大量用户对同一账户操作) 只是对于一般的小型站点的应用,并发高的话 採用读写分离基本上就能解决这个问题,本文主要是针对大型站点高并发数据库设计讨论. 一.对数据库表的訪问比較均衡,业务导向明显(网上商城,多条业务线) 像这样的情况,

电商 秒杀系统 设计思路和实现方法

电商 秒杀系统 设计思路和实现方法 2017年05月26日 00:06:35 阅读数:3662 1 秒杀业务分析 正常电子商务流程 (1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单:(5)付款:(6)卖家发货 秒杀业务的特性 (1)低廉价格:(2)大幅推广:(3)瞬时售空:(4)一般是定时上架:(5)时间短.瞬时并发量高: 2 秒杀技术挑战 假设某网站秒杀活动只推出一件商品,预计会吸引1万人参加活动,也就说最大并发请求数是10000,秒杀系统需要面对的技术挑战有: 对现有网站业务造

Java精品高级课,架构课,java8新特性,P2P金融项目,程序设计,功能设计,数据库设计,第三方支付,web安全,视频教程

36套精品Java架构师,高并发,高性能,高可用,分布式,集群,电商,缓存,性能调优,设计模式,项目实战,P2P金融项目,大型分布式电商实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  cloud.Dubbo.Elasticsearch,Redis.ActiveMQ.Nginx.Mycat.Spring.MongoDB.ZeroMQ.Git.Nosql.Jvm.Mecached.Netty.Nio.Mina.java8新特性,P2P金融项目,程序设计,

从零开始编写自己的C#框架(9)——数据库设计与创建

对于千万级与百万级数据库设计是有所区别的,由于本项目是基于中小型软件开发框架来设计,记录量相对会比较少,所以数据库设计时考虑的角度是:与开发相结合:空间换性能:空间换开发效率:减少null异常......当然不同的公司与项目要求不同,初学者要学会适应不同的项目开发要求,使用本框架开发时,必须严格按照本章节的要求来设计数据库,不然可能会产生不可控的异常. 从零开始编写自己的C#框架 数据库设计规范   文件状态: [√] 草稿 [  ] 正式发布 [  ] 正在修改 文件标识: C#框架 当前版本

MVC实战之排球计分(一)—— 需求分析与数据库设计

一.需求分析: 这个程序是排球计分程序,其业务非常简单,具体如下: 1.本程序可以选择用户身份,通过不同角度记录比赛分数. 2.不同身份记录的比赛成绩将会存储在不同的数据表(目前适合运动员和观众使用). 3.用户键入数据后,可以继续对数据进行操作(如:删除.修改.查看详情). 4,不同的身份的用户 ,不能修改非己的数据.只能修改自己的数据. 这个项目的用例图如下: 数据库设计:设计数据表之前,首先进行实体和关系的识别与确定.通过需求分析,可以观察得出,本项目的实体有:观众,运动员.(观众可以修改

02-大鸭梨博客系统数据库设计及Dapper的使用

毫无疑问,数据库的设计在一个系统中起了至关重要的作用.我们都知道,系统设计分为两部分,或者说是两个阶段,即数据库设计和功能设计.构建一个完善的系统需要这两个阶段的充分考量.周密设计.合理联接以及密切配合.数据库设计是整个系统的根基,它关乎系统功能的实现.稳定性.扩展性等多个方面,可见数据库设计的重要性. 那么好的数据库设计应该具备什么样的基本条件呢,大致有这么几点: 1.充分体现系统的需求 不管是数据库设计还是功能设计,我们最终的目的都是要实现客户的业务需求,所以数据库设计的第一准则就是要符合业