以前、12306 のバックエンド ロジックを分析している人を見ました。 。鉄道チケットの予約やキャンセルは通常のショッピングとは異なります。
問題の 1 つは、鉄道の切符が異なる駅で販売される可能性があることです。たとえば、北京から上海までの鉄道チケットには、北京-済南、済南-南京など、途中で多くの停留所が含まれる場合があります。これらのチケットにアクセスするためのデータ モデルをどのように設計するかが問題です。単純な数量 -1 の代わりに。
その中に良いアイデアを見つけました。たとえば、北京から上海まで合計 10 駅ある場合、全距離チケットの初期状態は '1111111111' になります。 ;
販売 全行程の切符を購入した場合、切符は「0000000000」になります。
北京-済南 3 駅 (最初の停留所から 3 番目の停留所) の切符を販売した場合、切符は「0000000000」になります。 '0011111111';
徐州-南京 (停留所 6 ~ 9) などの別の半距離チケットを販売する場合、前のチケットは '0011100011';
チケットをキャンセルするロジックは非常に簡単で、チケット (徐州-南京) を払い戻したい場合は、チケットプールから購入できない最初のチケット
(徐州-南京) を見つけて変更します。 OK (チケット購入の逆) たとえば、上記のチケット「0011100011」が見つかった場合、払い戻し後のチケットは (0011111111) になります。
基本的なロジックは上記のとおりです。12306 は複数のエントリとデータの一貫性を同時に確保する必要があり、チケットのチェックを処理するには非常に効率的なロジックが必要です。
小さくて効率的なデータ構造が重要になります。
self.ticketsPool = [];
self._init= function(number){
if(typeof(number) != 'number') throw ('type error');
for(i=0;i
}
};
//AND または OR 演算を通じてチケットを購入できるかどうかを決定します。
// 例: 注文 o は北京-済南 ( 001111111)、特定のチケットは (1111100011) (徐州-南京で販売) の場合、 true
self.canBuy = function(o,t){
var _o = ''
for( j =0; j
}
var r1 = (parseInt(t.tic,2) ) | parseInt(o,2)) & parseInt(_o,2);
var r2 = parseInt(_o,2);
return r1 == r2;
};
//チケットを販売します
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' などのバイナリ文字列の変更;
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;
}
//返金、または操作
for(i=0;i < self.ticketsPool.length;i ){
if(!self. canBuy(o,self.ticketsPool[i])){
var _o = ''
for(j=0; j
}
self.ticketsPool[i].tic = (parseInt(self.ticketsPool[i].tic,2) | parseInt(_o,2)).toString(2) );
return i;
}
};
return -1;
}
//データモデル: ticket
var self = this;
//最初のチケットは完全なチケットです
self.tic = '1111111111';
}
//データモデル: Order
var self = this;
var s = '';
for(i=0;i s = (i>=from && i
return s;
}
//12306 バックエンド
//初期状態、チケットプールには 400 個の完全なチケットがあります
Server._init(400);