之前看到有人分析12306后台的逻辑。。火车票的预定和退订不同于普通的购物。
一个难题就是火车票可以分站来卖。比如,一张北京到上海的火车票,沿途可以有很多站,可以北京-济南,济南-南京...等等。如何设计数据模型来存取这些票是一个问题。而不是简单的数量+-1.
其中看到一条思路挺好:用二进制字符串来表示一张火车票,比如,北京到上海共10站,那么一张全程票初始状态表示为:'1111111111';
卖出一张全程票,则该票变为'0000000000';
卖出一张半程票,比如北京-济南三站(第一站-第三站),则票变为'0011111111';
再卖出一张半程票,比如徐州-南京(第6站-第9站),则上一张票变为:'0011100011';
退订票的逻辑就很简单了,我要退一张(徐州-南京)的票,则从票池中找到第一张不能买
(徐州-南京)的票,更改它就OK(买票的逆向).比如,找到了上面的一张票'0011100011',
退票后,此票变为(0011111111);
基本逻辑如上,12306要保证多入口,而同时数据的一致性,需要很高效的逻辑来处理查票,
买票,退票的业务,据说高峰每秒会有20万请求。将票的数据结构保存在内存中。而非数据库。
小而高效的数据结变得很重要。
复制代码 代码如下:
if(jQuery){}else{
//document.write
}
function Server(){
var self = this;
self.ticketsPool = [];
self._init= function(number){
if(typeof(number) != 'number')
throw ('type error');
for(i=0;i<number;i++){
self.ticketsPool.push(new Ticket());
}
};
//判断一张票是否可以买,通过与或运算来实现。
//比如:订单o为北京-济南(001111111),某张票为(0000000011)(已卖出北京-南京),那么返回false
//比如:订单o为北京-济南(001111111),某张票为(1111100011)(已卖出徐州-南京),那么返回true
self.canBuy = function(o,t){
var _o = ''
for(j=0; j<o.length; j++){
_o += o[j]=='0'?1:0;
}
var r1 = (parseInt(t.tic,2) | parseInt(o,2)) & parseInt(_o,2);
var r2 = parseInt(_o,2);
return r1 == r2;
};
//卖出一张票
self.pop1Ticket = function(o){
for(i=0;i < self.ticketsPool.length;i++){
if(self.canBuy(o,self.ticketsPool[i])){
self.buy(self.ticketsPool[i],o);
return i;
}
};
return -1;
};
//卖出票的实现,改变二进制字符串,比如'111111111'->'001111111';
self.buy = function(t,o){
t.tic = (parseInt(t.tic,2) & parseInt(o,2)).toString(2);
//alert(t.tic);
};
//查询余票
self.remainTics = function(o){
var count=0;
for(i=0;i < self.ticketsPool.length;i++){
count += self.canBuy(o,self.ticketsPool[i])?1:0;
};
return count;
}
//退票,或 运算
self.refund = function(o){
for(i=0;i < self.ticketsPool.length;i++){
if(!self.canBuy(o,self.ticketsPool[i])){
var _o = ''
for(j=0; j<o.length; j++){
_o += o[j]=='0'?1:0;
}
self.ticketsPool[i].tic = (parseInt(self.ticketsPool[i].tic,2) | parseInt(_o,2)).toString(2);
return i;
}
};
return -1;
}
}
//数据模型:票
function Ticket(){
var self = this;
//票的初始为全程票
self.tic = '1111111111';
}
//数据模型:订单
function Order(from, to){
var self = this;
var s = '';
for(i=0;i<10;i++){
s += (i>=from && i<to)?0:1;
}
return s;
}
//12306后台
Server = new Server();
//初始状态,票池有400张全程票
Server._init(400);
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】