昨天,大家在群里讨论了下12306的售票系统的算法问题,@北京-一苇渡江11同学和我提了要最小粒度锁,我给了一个相对简单的数据模型,不晓得可行性如何,欢迎大家拍砖。


我们假定有一趟列车K200,途径10个站点,我们分别用数字1,2...10来表示每个站点,这趟车我们假定只有10个座位,用A,B,C字母代替,其中规定,A座位只能在1号站点卖,但是终点随意,且到达终点被释放后可以给后面任意一个站点销售,B只能给2好站点卖,到终点后的策略和A座一个道理!以此类推!


模型如下:

12345678910
ABCDEFGHIJ

这个时候我们找个数据模型来表示余票信息,

模型需要标记的是车次,座位,起始站点,终点站,买卖标记,站内票(就是分配给该站,不得在其它站点卖),那么铁道部开始放票的初始化余票信息为:

车次座位起点站终点站买卖标记站内票
K200A111未卖
K200
B211未卖
K200
C311未卖
K200
D411未卖
K200
E511未卖
K200
F611未卖
K200
G711未卖
K200
H811未卖
K200
I911未卖
K200
J1011未卖

现在我们假定有个人买一张从1站点到4站点的人,现在1号站点没票,四号站点有了两张票,其中下车的人的票用字母A1表示,但是因为后面的5,6,7,8,9,10号站点都可以卖票A1,所以实际上现在4以后的站点都变成了有两张票,我们的表格数据变成如下:

车次座位起点站终点站买卖标记站内票
K200A14已卖
K200A411未卖
K200
B211未卖
K200
C311未卖
K200
D411未卖
K200
E511未卖
K200
F611未卖
K200
G711未卖
K200
H811未卖
K200
I911未卖
K200
J1011未卖


那现在从上面的表格看出,1号站点已经没有票了,一个站点的余票信息是,如果非站内票,那么起始站点只要小于等于本站就行,如果站内票,则起始站点必须等于本站!所以可以看到2,3是还有一张票,4-10有两张票!

如果现在有个用户购买了6-8的票,一般是站内票优先,因为只能在该站卖,所以F票卖出,在8下车后变成了F1,这个时候8和9和10都有三张票。那要是再来一个用户需要买6-8的票,这个时候只能出A1的票,这样A座位就变成在4-6可以卖,8-10也可以卖!数据变成了如下:

车次座位起点站终点站买卖标记站内票
K200A14已卖
K200A46未卖
K200A68已卖
K200A811未卖
K200
B211未卖
K200
C311未卖
K200
D411未卖
K200
E511未卖
K200
F68已卖
K200
F811未卖
K200
G711未卖
K200
H811未卖
K200
I911未卖
K200
J1011未卖



当然还有一部分票可以卖,就是各个起点站之前的这部分票,可以看做短途票。下面的这部分票务购买和上面的逻辑一样!

车次座位起点站终点站买卖标记站内票
K200B12未卖
K200C13未卖
K200D14未卖
K200E15未卖
K200F16未卖
K200G17未卖
K200H18未卖
K200I19未卖
K200J110未卖

以上就是个人的粗略想法,欢迎大家拍砖!