【引言】 在天涯上看到有人发帖,也在Iteye上看到相同论调,本人对某些人所谓的“库存”难题的思路不以为然,对此,鄙人给出个算法模型,献丑,只为打某些人的脸!
一下是iteye上一篇文章提出的问题
引用
好了,讲了这半天淘宝,可以说12306了吧?
我以北京西到深圳北的G71次高铁为例(这里只考虑南下的方向,不考虑深圳北到北京西的,那是另外一个车次,叫G72),它有17个站(北京西是01号站,深圳北是17号站),3种座位(商务、一等、二等)。表面看起来,这不就是3个商品吗?G71商务座、G71一等座、G71二等座。大部分轻易喷12306的技术人员(包括某些中等规模公司的专家、CTO)就是在这里栽第一个跟头的。
实际上,G71有136*3=408种商品(408个SKU),怎么算来的?请看:
如果卖北京西始发的,有16种卖法(因为后面有16个站),北京西到:保定、石家庄、郑州、武汉、长沙、广州、虎门、深圳。。。。都是一个独立的商品,
同理,石家庄上车的,有15种下车的可能,以此类推,单以上下车的站来计算,有136种票:16+15+14....+2+1=136。每种票都有3种座位,一共是408个商品。
好了,再看出票时怎么减库存,由于商务、一等、二等三种座位数是独立的,库存操作也是一样的,下文我就不再提座位的差别的,只讨论出发与到达站。另外,下文说的是理论世界的模型,不是说12306的数据库就是这么设计的。
旅客A买了一张北京西(01号站)到保定东(02号站)的,那【北京西到保定东】这个商品的库存就要减一,同时,北京西到石家庄、郑州、武汉、长沙、广州、虎门、深圳等15个站台的商品库存也要减一,也就是说,出一张北京到保定东的票,实际上要减16个商品的库存!
这还不是最复杂的,如果旅客B买了一张北京西(01号站)到深圳北(17号站)的票,除了【北京西到深圳北】这个商品的库存要减一,北京西到保定东、石家庄、郑州、武汉、长沙、广州、虎门等15个站台的商品库存也要减1,保定东到石家庄、郑州、武汉、长沙、广州、虎门、深圳北等15个站台的商品库存要减1。。。总计要减库存的商品数是16+15+14+……+1=120个。
当然,也不是每一张票都的库存都完全这样实时计算,可以根据往年的运营情况,在黄金周这样的高峰时段,预先对票做一些分配,比如北京到武汉的长途多一点,保定到石家庄的短途少一点。我没有证据证实铁道部这样做了,但我相信,在还没有12306网站的时候,铁道部就有这种人工预分配的策略了。
这里是我给出的模型思路
1.假设一列车从 A站驶往Z站 ,车上共有500个座位,也就是500张票
途径站点示意图如下:(用专业的话说,一个长度26的数组)
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
有乘客甲购买了从 C --> R 站的车票,则在本列车对应站点的数组位置 +1,这里注意R站下车,R站不加1
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
乘客乙购买了从 H--》V 的车票 ,同样在本列车对应站点的数组位置 +1
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 0 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 1 1 1 1
那么当乘客丙要购买从 A --》 P 站的票时,系统只要计算,从数组A --> P位置上乘客数量是否都小于500即可
请问,这样的算法很逻辑很复杂么??!!加一操作现在很多NoSQL数据库都能支持原子性操作的。
另外给出12306在系统架构上的2点可能可行的建议
第一,按不同列车划分服务器,需要同步的是列车的数据,不同列车可以分布在不同服务器计算
第二,同一列列车的票务计算应该分服务器,以“分销商”形式进行分布式结算
以上述例子为例,如果将500张票,从总服务器预售给5台子服务器,每台子服务器售出自己的100张票后,在向总服务器结算,并从其他子服务器进行重新调度,这样同样避免了中央服务器的负担,同时能保证数据一致性问题。
上述设计只是个框架性草案,只想告诉大家,12306的设计虽然复杂,但绝对没有某些人吹嘘的那样不能解决。我的这些算法估计在淘宝工程师面前,只是小儿科,别跟我较真。
总之,想铁道部那么大的机构,搞不定这样的问题,只能喷它管理不善,
分享到:
相关推荐
该源码是一款基于Java、Vue、JavaScript、HTML的12306售票系统模拟设计,总计包含336个文件,其中Java源文件196个,Vue组件35个,...该项目旨在模拟真实的12306售票流程,为用户提供一个功能完备的票务服务体验模拟。
12306是中国铁路客户服务中心的官方网站,其售票系统采用了一种独特的算法来处理庞大的购票需求。本文将重点探讨12306售票算法的Java实现,以及如何在实际操作中确保公平性和效率。 一、座位编码与占位策略 12306...
首先,毕业设计的选择通常由学生根据个人兴趣、专业方向以及实际需求来确定。学生需要在导师的指导下明确研究目标、问题陈述,确立研究的范围和深度。毕业设计可以包括文献综述、需求分析、方案设计、实施与测试等多...
在本篇《Java代码实践12306售票算法(二)》中,我们将深入探讨如何用Java实现12306的售票逻辑。12306是中国铁路客户服务中心的在线订票系统,其售票算法是处理大量并发请求的关键。下面我们将详细解析文中提到的几个...
12306互联网售票系统的架构优化及演进 12306互联网售票系统的架构优化及演进是指对12306互联网售票系统的架构进行优化和演进,以提高系统的性能和可扩展性。该系统的架构优化是为了解决系统在高峰期的访问量超出...
毕业设计是高等教育阶段学生完成学业的一个重要环节,通常在学士或硕士学业即将结束时进行。这是学生将在整个学业中所学知识和技能应用到实际问题上的机会,旨在检验学生是否能够独立思考、解决问题,并展示其专业...
仿12306汽车售票系统是一个模仿中国铁路12306官方购票平台的项目,旨在实现汽车票的在线预订、查询、支付等功能。这个系统可能包括前端用户界面、后端服务器处理逻辑以及配套的数据库设计。由于描述中提到"一些小的...
Java实战高性能12306售票系统源码.zip # Java实战高性能12306售票系统 ## 一、SQL初始化 ### 0、重点说明 按课程给出的代码,至少需要本地创建7个database: (可参考 common/src/main/resources/application-...
# 基于Spring Cloud Alibaba的仿12306售票系统 ## 项目简介 本项目是一个仿照12306售票系统的微服务项目,采用Spring Cloud Alibaba、Spring Boot 3、JDK 17、MySQL、Redis、Nacos、Sentinel、Seata、RocketMQ等...
该项目通过Spring Boot 3和微服务架构,模拟实现了一个类似于12306的高性能火车票售票系统,展示了在现代Web开发中如何处理高并发和分布式系统设计。项目适合于学习微服务架构和大型分布式系统设计的开发者。项目...
分享课程——新版Springboot3.0打造能落地的高并发仿12306售票系统
该源码是一款基于SpringCloudAlibaba架构的仿12306售票系统,采用Vue进行前端设计。项目包含84个文件,涵盖37个Java源文件、13个Vue组件、9个XML配置文件、7个JavaScript脚本、2个Git忽略规则、2个HTTP配置、2个YAML...
基于Qt平台的简易互联网汽车售票系统,使用MySql数据库开发,编程语言是c++,图形库是Qt,界面良好,因为是初学者,所以程序可能有累赘之处,希望和大家一起交流,欢迎指正,共同进步。文件中附有sql文件。
首先,毕业设计的选择通常由学生根据个人兴趣、专业方向以及实际需求来确定。学生需要在导师的指导下明确研究目标、问题陈述,确立研究的范围和深度。毕业设计可以包括文献综述、需求分析、方案设计、实施与测试等多...
铁路12306互联网售票系统作为铁路售票服务的重要组成部分,主要为旅客提供在线购买火车票的服务。随着互联网技术的发展与应用普及,铁路12306系统也面临着从IPv4向IPv6过渡的挑战。IPv4地址空间的枯竭和网络智能化的...
《构建模拟12306铁路购票系统的Java技术解析》 在信息技术日益发达的今天,模拟12306铁路购票系统是一项具有挑战性的实践项目,它涉及到多种核心技术的运用,如用户登录注册、购票流程、信息安全管理以及支付功能等...
12306 项目中包含了缓存、消息队列、分库分表、设计模式等代码,通过这些代码可以全面了解分布式系统的核心知识点。 12306 铁路购票服务是与大家生活和出行相关的关键系统,包括会员、购票、订单、支付和网关等服务...