12306藏着全球最复杂的卖票逻辑小贾的科普日常

2/9/2026

每年春运,几乎每个人都经历过同样的崩溃:提前 15 天定好闹钟,开票瞬间疯狂刷新,结果1 秒就没票。可你换个搜索方式,同一趟车,全程票明明还有余票,中间区间却显示无票。

很多人骂套路、骂系统、骂 “故意不放票”,但真相远比你想象的更硬核、更公平,也更无奈。

今天我们就彻底拆解:全球瞬时并发量最大、逻辑最复杂的交易系统 ——12306,到底是怎么卖票的?

为什么它宁愿留着全程票,也不轻易卖给短途乘客?面对每秒数百万次请求,它又是如何做到不崩、不乱、不被黄牛玩崩的?

01、别拿双十一对比:12306 的复杂度被严重低估

不少人习惯把 12306 和淘宝双 11、京东 618 放在一起比较,认为都是高并发场景,难度差不多。但这种对比,严重低估了铁路售票系统的真实难度。

普通电商的逻辑非常简单:你买一件衣服,库存 - 1,完全不影响裤子、鞋子、家电。每个商品都是独立 SKU,互不干扰。

火车票完全不同,它的核心难点只有一句话:一张票,会锁死整条线路的无数种组合。

你买一张包头到广州的全程票,意味着:包头到石家庄、保定到郑州、郑州到长沙、长沙到广州……所有途经区间的车票,全部同步减 1。

反过来,你买一张中间区间的票,所有包含这段路程的长途票,也必须同步减库存。

这就是动态库存—— 牵一发动全身,复杂度直接爆炸式增长。

举个最直观的例子:一列火车只停 A→B→C→D 4 个站,出票组合就有 3+2+1=6 种。10 个站点,组合就达到 45 种。

现实更夸张:K598 次列车从包头到广州白云,途经35 个站点,理论出票组合高达595 种。一列列车定员约 1300 人,仅这一班车,就有77 万种以上座位组合。春运期间,全国每天开行超过11000 列列车。

更严苛的是,系统必须同时满足两大规则:

依赖性卖一段座位,整条线路所有组合都要同步加减,毫秒级完成。

排他性一个座位、一个区间,绝对不能重复卖给两个人,不能超售、不能冲突。

一边是爆炸式的车票组合,一边是日访问量高达 800 亿次,14 亿人的出行重担,全部压在这套系统上。

02、扛住亿级流量:12306 把系统一分为二

早期 12306 频繁崩溃、卡顿,核心问题只有两个:

一是访问量太大,服务器扛不住,二是组合太复杂,算力处理不过来

而且两者互相放大:越算不过来,请求越堆积;越堆积,越算不过来。

12306 的破局思路非常干脆:把系统拆成两套,流量和交易彻底分离。

大家买票时,75% 以上的操作都是查票、刷票、看时间、对比车次,真正下单支付的动作只占极少部分。

于是架构变成:

刷票、查询等高流量 → 公有云扛压

下单、支付、锁座等核心环节 → 私有云安全运行

一分流,整个系统瞬间清爽。这也是近几年,你几乎再也看不到 “12306 崩了” 上热搜的原因。

但分流只解决 “不崩”,不解决 “算得快”。真正的黑科技,藏在位图运算里。

03、抛弃传统数据库:12306 用 0 和 1 卖票

传统数据库卖票,会遇到致命问题:锁等待、死锁。多人同时抢同一段、同个座位,系统要查表、锁定、修改、释放,高并发下很容易出现冲突、卡顿、重复售票。

12306 直接放弃笨重的数据库逻辑,改用极致高效的位图运算。

简单理解:把一段座位的通行区间,用一串二进制 0/1 表示。

0 = 空闲

1 = 已占用

有人买 A→C 区间,系统生成一个掩码,比如 110,代表前两段占用、第三段不占用。和当前座位状态做一次位运算:不冲突 → 出票;冲突 → 拒绝。

整个过程:没有复杂查表、没有长事务、没有死锁,全部变成 CPU 最擅长、最快的基础位运算。

就这一招,让 12306 在超高并发下,依然做到:不超售、不重复、不混乱。

最扎心真相:为什么短途秒空,全程还有票?

技术再强,也绕不开一个终极现实:运力是有限的。

火车就这么多车厢、这么多座位,春运需求却是爆发式、井喷式的。系统必须做取舍,而取舍的核心,就是公平与效率。

你一定遇到过这种情况:

搜南京→苏州:无票,搜北京→上海:有余票

同一趟车,同一座位,为什么区别这么大?

答案就是 12306 最核心、也最被误解的策略:全程优先,区间限售(保长限短)

为什么要这么做?

第一:保证运力不浪费铁路追求的是旅客周转量最大化。

如果先把短途票全卖光,很可能出现:A→B 有人,B→C 空着,C→D 又空着,整趟车大量座位浪费。

卖长途票,可以保证:一个座位,从起点坐到终点,利用率 100%。

第二:保护选择权更少的人长短途旅客,本质是零和博弈。

短途乘客:没火车,可以选大巴、城际、顺风车。

长途乘客:跨省长距离,替代方案极少,没火车票,很可能真的回不了家。

12306 的逻辑是:优先保障最没办法、最依赖火车的人。

这也是为什么:放票初期,大量区间票被锁住、少放、不放,越临近发车,系统才会逐步释放余票。

很多人崩溃于 “提前 15 天都抢不到”,其实不是票卖完了,是票还没放出来。

再叠加退票、改签回流,越靠近开车,反而越容易抢到票。

Scroll for more