ホームページ >ウェブフロントエンド >jsチュートリアル >Javascriptによる模擬鉄道切符の予約・払い戻し例_基礎知識

Javascriptによる模擬鉄道切符の予約・払い戻し例_基礎知識

WBOY
WBOYオリジナル
2016-05-16 16:51:221454ブラウズ

以前、12306 のバックエンド ロジックを分析している人を見ました。 。鉄道チケットの予約やキャンセルは通常のショッピングとは異なります。
問題の 1 つは、鉄道の切符が異なる駅で販売される可能性があることです。たとえば、北京から上海までの鉄道チケットには、北京-済南、済南-南京など、途中で多くの停留所が含まれる場合があります。これらのチケットにアクセスするためのデータ モデルをどのように設計するかが問題です。単純な数量 -1 の代わりに。

その中に良いアイデアを見つけました。たとえば、北京から上海まで合計 10 駅ある場合、全距離チケットの初期状態は '1111111111' になります。 ;
販売 全行程の切符を購入した場合、切符は「0000000000」になります。
北京-済南 3 駅 (最初の停留所から 3 番目の停留所) の切符を販売した場合、切符は「0000000000」になります。 '0011111111';
徐州-南京 (停留所 6 ~ 9) などの別の半距離チケットを販売する場合、前のチケットは '0011100011';

チケットをキャンセルするロジックは非常に簡単で、チケット (徐州-南京) を払い戻したい場合は、チケットプールから購入できない最初のチケット
(徐州-南京) を見つけて変更します。 OK (チケット購入の逆) たとえば、上記のチケット「0011100011」が見つかった場合、払い戻し後のチケットは (0011111111) になります。
基本的なロジックは上記のとおりです。12306 は複数のエントリとデータの一貫性を同時に確保する必要があり、チケットのチェックを処理するには非常に効率的なロジックが必要です。

チケットの購入と払い戻しのビジネスには 200,000 件のリクエストがあると言われています。ピーク時で1秒あたり。チケットのデータ構造をメモリに保存します。データベースではなく。

小さくて効率的なデータ構造が重要になります。


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 self.ticketsPool.push(new Ticket());
}
};

//AND または OR 演算を通じてチケットを購入できるかどうかを決定します。

//例: 注文 o は北京-済南 (001111111)、特定の航空券は (0000000011) (北京-南京は販売済み) の場合、 false を返します

// 例: 注文 o は北京-済南 ( 001111111)、特定のチケットは (1111100011) (徐州-南京で販売) の場合、 true
self.canBuy = function(o,t){
var _o = ''
for( j =0; 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 = o[j]== '0'?1:0;
}
self.ticketsPool[i].tic = (parseInt(self.ticketsPool[i].tic,2) | parseInt(_o,2)).toString(2) );
return i;
}
};

return -1;

}

}

//データモデル: ticket

function Ticket(){

var self = this;
//最初のチケットは完全なチケットです
self.tic = '1111111111';
}

//データモデル: Order

function Order(from, to){

var self = this;
var s = '';
for(i=0;i s = (i>=from && i }
return s;
}

//12306 バックエンド

Server = new Server();

//初期状態、チケットプールには 400 個の完全なチケットがあります
Server._init(400);


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。