昨天,大家在群里讨论了下12306的售票系统的算法问题,@北京-一苇渡江11同学和我提了要最小粒度锁,我给了一个相对简单的数据模型,不晓得可行性如何,欢迎大家拍砖。
我们假定有一趟列车K200,途径10个站点,我们分别用数字1,2...10来表示每个站点,这趟车我们假定只有10个座位,用A,B,C字母代替,其中规定,A座位只能在1号站点卖,但是终点随意,且到达终点被释放后可以给后面任意一个站点销售,B只能给2好站点卖,到终点后的策略和A座一个道理!以此类推!
模型如下:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
A | B | C | D | E | F | G | H | I | J |
这个时候我们找个数据模型来表示余票信息,
模型需要标记的是车次,座位,起始站点,终点站,买卖标记,站内票(就是分配给该站,不得在其它站点卖),那么铁道部开始放票的初始化余票信息为:
车次 | 座位 | 起点站 | 终点站 | 买卖标记 | 站内票 |
K200 | A | 1 | 11 | 未卖 | 是 |
K200 | B | 2 | 11 | 未卖 | 是 |
K200 | C | 3 | 11 | 未卖 | 是 |
K200 | D | 4 | 11 | 未卖 | 是 |
K200 | E | 5 | 11 | 未卖 | 是 |
K200 | F | 6 | 11 | 未卖 | 是 |
K200 | G | 7 | 11 | 未卖 | 是 |
K200 | H | 8 | 11 | 未卖 | 是 |
K200 | I | 9 | 11 | 未卖 | 是 |
K200 | J | 10 | 11 | 未卖 | 是 |
现在我们假定有个人买一张从1站点到4站点的人,现在1号站点没票,四号站点有了两张票,其中下车的人的票用字母A1表示,但是因为后面的5,6,7,8,9,10号站点都可以卖票A1,所以实际上现在4以后的站点都变成了有两张票,我们的表格数据变成如下:
车次 | 座位 | 起点站 | 终点站 | 买卖标记 | 站内票 |
K200 | A | 1 | 4 | 已卖 | 是 |
K200 | A | 4 | 11 | 未卖 | 否 |
K200 | B | 2 | 11 | 未卖 | 是 |
K200 | C | 3 | 11 | 未卖 | 是 |
K200 | D | 4 | 11 | 未卖 | 是 |
K200 | E | 5 | 11 | 未卖 | 是 |
K200 | F | 6 | 11 | 未卖 | 是 |
K200 | G | 7 | 11 | 未卖 | 是 |
K200 | H | 8 | 11 | 未卖 | 是 |
K200 | I | 9 | 11 | 未卖 | 是 |
K200 | J | 10 | 11 | 未卖 | 是 |
那现在从上面的表格看出,1号站点已经没有票了,一个站点的余票信息是,如果非站内票,那么起始站点只要小于等于本站就行,如果站内票,则起始站点必须等于本站!所以可以看到2,3是还有一张票,4-10有两张票!
如果现在有个用户购买了6-8的票,一般是站内票优先,因为只能在该站卖,所以F票卖出,在8下车后变成了F1,这个时候8和9和10都有三张票。那要是再来一个用户需要买6-8的票,这个时候只能出A1的票,这样A座位就变成在4-6可以卖,8-10也可以卖!数据变成了如下:
车次 | 座位 | 起点站 | 终点站 | 买卖标记 | 站内票 |
K200 | A | 1 | 4 | 已卖 | 是 |
K200 | A | 4 | 6 | 未卖 | 否 |
K200 | A | 6 | 8 | 已卖 | 否 |
K200 | A | 8 | 11 | 未卖 | 否 |
K200 | B | 2 | 11 | 未卖 | 是 |
K200 | C | 3 | 11 | 未卖 | 是 |
K200 | D | 4 | 11 | 未卖 | 是 |
K200 | E | 5 | 11 | 未卖 | 是 |
K200 | F | 6 | 8 | 已卖 | 是 |
K200 | F | 8 | 11 | 未卖 | 是 |
K200 | G | 7 | 11 | 未卖 | 是 |
K200 | H | 8 | 11 | 未卖 | 是 |
K200 | I | 9 | 11 | 未卖 | 是 |
K200 | J | 10 | 11 | 未卖 | 是 |
当然还有一部分票可以卖,就是各个起点站之前的这部分票,可以看做短途票。下面的这部分票务购买和上面的逻辑一样!
车次 | 座位 | 起点站 | 终点站 | 买卖标记 | 站内票 |
K200 | B | 1 | 2 | 未卖 | 否 |
K200 | C | 1 | 3 | 未卖 | 否 |
K200 | D | 1 | 4 | 未卖 | 否 |
K200 | E | 1 | 5 | 未卖 | 否 |
K200 | F | 1 | 6 | 未卖 | 否 |
K200 | G | 1 | 7 | 未卖 | 否 |
K200 | H | 1 | 8 | 未卖 | 否 |
K200 | I | 1 | 9 | 未卖 | 否 |
K200 | J | 1 | 10 | 未卖 | 否 |
以上就是个人的粗略想法,欢迎大家拍砖!
关于12306火车票销售的简单思考,布布扣,bubuko.com
原文:http://ginkuing.blog.51cto.com/606240/1384547