我为12306想想办法

我也是一名程序猿,虽然还未走出校门,但是自认为还有一定基础。每次过年回家都要经历“抢票战争”,每次都会在心里默默的把铁道部(当然现在已经不是铁道部了)骂个狗血淋头。总觉得X亿做出来个这东西,给1000万我都能搞。前一段看了一篇名为《身为码农,为12306说两句公道话》的文章(没看过的请戳这里:http://blog.jobbole.com/55001/ ),觉得自己当初确实把这个项目想小了,把12306的技术看扁了。但我有一些想法与原作者不尽相同,现在写出来与各位分享。请内行多指导,也欢迎外行看热闹。如果觉得我说的不对,欢迎拍砖。拍,请重拍。

第一点,关于数据库的库存问题。

我在评论里也说过,假设有以下9个站:北京、保定、石家庄、郑州、武汉、长沙、广州、虎门、深圳。对于一个指定的座位来说,库存商品应该只设9个就够了。商品只要列出站点,只要该座位在这一站有人坐,就需要打上“sold”标记,而不用考虑该乘客的起止站点,并不需要列出具体多少种卖法。价格问题:价格是固定的,不管票是否卖出去了,定价都是不会变的。所以价格单独存放在一个表里就行,不需要和库存在一起。

有网友指出了我的错误。“方式并没有问题,但是其实算法反而复杂了。注意:“对于一个指定的座位来说,库存商品只设9个”,也就是说通过“是否”判断(即Sold/unsold的方法)扩展了无数个库存商品。”

所以我改进了我的思路,把sold/unsold状态替换为座位余量。如果该列车一共有100个座位,北京——保定卖了50张,“北京”-50,北京——石家庄卖了50张,“北京”-50,“保定”-50。此时查询北京——石家庄的余票,因为“北京”这站可售票是0,就不能销售。这样就只要统计每站的可售余票就好。但是,众所周知,每张票上都印有座位号。这就表示每个座位都应该对应数据库里的一条记录,而且这个记录应该有一个表示“该座位是否可以销售”的状态。所以,不管用什么方法,12306的数据量始终都是不可小视的。

第二点,抢票插件。

我对火车票的需求仅仅是每学期放假回家的那一次,所以只用过几个浏览器的抢票插件,没有发现更没有用到过媒体说黄牛用的“抢票软件”。12306刚上线的那段时间,媒体说“抢票插件”是作弊、不公平,直到现在12306自己增加了自动刷新、自动提交功能,是不是自己给自己的一记耳光?根据我的体验,抢票插件没有绕过5秒的查询间隔、没有自动输入验证码、没有绕过排队,与不用插件的新版12306网页相比,唯一快在了“输入验证码自动提交”这个选项,省掉了鼠标点击“确定”按钮的这一步用掉的零点几秒。

我想,原文中所说的“抢票插件”应该是带有识别验证码功能的软件,这样以来,节省的时间就不只是一两秒那么简单了。所有的系统都会有漏洞,12306当然不例外。所谓的“防抢票的技术手段”,无非就是防君子不防小人。猎豹、360、百度,谁不会做个识别验证码的插件添加到浏览器里?但是这赤裸裸的是作弊,所以他们都没有这么做。但黄牛不会考虑这些,只要能让他们把握票源,什么事他们都敢干。12306能做的只能是在发现漏洞后及时修补,却不能未卜先知,知道下一个被攻破的是什么。12306不能怕挨骂,因为有人骂你说明有人关心你你看有谁骂过我的网站?因为只有我自己知道我的网站。

为什么有|“抢票插件”的存在?归根结底还是火车运力不足。“抢票”不只是在有了12306之后才有。在12306上线之前,为什么售票大厅有人彻夜排队?为什么有人因为插队打架?为什么黄牛会花钱雇人排队?那不都是在“抢”吗?起码,在有了12306之后,大家不用再顶风冒雪去售票大厅排上几天几夜,也不会在排了几天几夜之后听到玻璃那边“没票了”的声音。现在只要提前几分钟或者十几分钟,在电脑前动动鼠标——虽然还是有可能买不到票,但我们好歹还在室内对吧?抢票插件的功能更多的不是在提高购买成功率上——因为很少有人不用抢票插件——而是它带给大家更多的希望,希望我这次能买得到票。

“抢”是永远存在的,即使是原来的柜台售票也是要分个先来后到的。

第三,我知道短时间提高火车运力并不现实,那么我说说我解决春运的办法吧。

原文中说的“抽签”法是下下策,比现在的“抢票”法还烂。以我自身为例,我的放假时间是116日,所以我要买116日的票。按原文中所说,提前两个月开放报名,也就是1116号,我报名参加抽签。但是我不确定我能拍,所以我会在1117日——25日都报名参加117日——25日的抽签。我想大家都有这个想法,所以想买115日票的人也会报名参加16日的抽签。这样不但不能减少压力,反而会增加压力。

1.提高卧铺价格、减少卧铺数量,普通火车也装动车那样的座位,增加硬座座位间距离。增加硬座座位间距离并不是为了卖更多的站票(消灭了站票更好),而是让那些本来可以不买卧铺的乘客去买硬座。减少一个卧铺车厢增加一个硬座车厢(不算站票),运力至少提高50人吧?把所有卧铺车厢都改成硬座(或者像动车的二等座一等座,至少让长途旅客坐的舒服),运力提高1/3不在话下吧?

2.春节期间补贴航空运输,开通“民工航班”、“学生航班”,价格是坐火车的1.5倍(不能高太多,因为从机场到家里、工地或学校到机场也需要费用),这样分流一部分愿意花钱的人花略多的钱去坐飞机,减少铁路压力。

3.承认并鼓励、补贴春节期间的“顺风车”,让道路运输为铁路分忧。

4.允许单位灵活调整假期。五一、十一对民工的意义不大,因为他们只身在外,放这些假也没什么用,所以大多数的民工在这些假期都是在工作,没有得到休息。如果允许用工单位灵活调整假期,五一、十一各休息一天,把剩下的假期挪到春节前,让大家的回家时间人为的错开,是不是也能减少一些压力呢?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值