Ich habe schon einmal jemanden gesehen, der die Backend-Logik von 12306 analysiert hat. . Das Buchen und Stornieren von Bahntickets unterscheidet sich vom normalen Einkaufen.
Ein Problem besteht darin, dass Bahntickets an verschiedenen Bahnhöfen verkauft werden können. Beispielsweise kann ein Zugticket von Peking nach Shanghai viele Zwischenstopps auf der Strecke haben, etwa Peking-Jinan, Jinan-Nanjing ... und so weiter. Ein Problem besteht darin, ein Datenmodell für den Zugriff auf diese Tickets zu entwerfen. Anstelle einer einfachen Menge -1.
Ich habe darunter eine gute Idee gesehen: Verwenden Sie eine Binärzeichenfolge, um ein Zugticket darzustellen. Wenn es beispielsweise insgesamt 10 Bahnhöfe von Peking nach Shanghai gibt, lautet der Ausgangszustand eines Vollstreckentickets: „1111111111“. ;
Verkaufen Wenn Sie ein Ticket für die gesamte Fahrt kaufen, wird das Ticket zu „0000000000“; wird zu „0011111111“;
Wenn Sie ein anderes Halbstreckenticket verkaufen, z. B. Xuzhou-Nanjing (Haltestelle 6-9), wird das vorherige Ticket zu „0011100011“;
(Xuzhou-Nanjing) und ändere es Es ist in Ordnung (die Umkehrung des Kaufs eines Tickets). Wenn Sie beispielsweise das obige Ticket „0011100011“ finden, wird das Ticket nach der Rückerstattung zu (001111111).
Die Grundlogik ist wie oben beschrieben. Es ist eine sehr effiziente Logik erforderlich, um die Ticketprüfung durchzuführen.
Das Geschäft mit dem Kauf und der Rückerstattung von Tickets hat seinen Höhepunkt erreicht von 200.000 Anfragen pro Sekunde. Speichern Sie die Ticketdatenstruktur im Speicher. statt einer Datenbank.
self.ticketsPool = [];
if(typeof(number) != 'number')
throw ('type error'); for(i=0;i
}
};
//Bestimmen Sie, ob ein Ticket über UND- oder ODER-Operationen gekauft werden kann.
//Zum Beispiel: Bestellung o ist Peking-Jinan (001111111) und ein bestimmtes Ticket ist (0000000011) (Peking-Nanjing wurde verkauft), dann Rückgabe von false
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;
};
//Ein Ticket verkaufen
self.pop1Ticket = function(o){
for(i=0;i < self.ticketsPool.length;i ){
self.buy(self.ticketsPool[i],o);
return i;
}
};
return - 1;
};
//Implementierung des Ticketverkaufs, Änderung der Binärzeichenfolge, z. B. '111111111'->'001111111';
self.buy = function(t,o){
t.tic = (parseInt (t.tic,2) & parseInt(o,2)).toString(2);
};
//Verbleibende Tickets abfragen
var count=0;
for(i=0;i < self.ticketsPool.length;i ){ count = self.canBuy(o,self.ticketsPool[i])?1:0;
};
return count;
}
//Rückerstattung oder Operation
self.refund = function(o){
for(i=0;i < self.ticketsPool.length;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;
}
}
//Datenmodell: Ticket
function Ticket(){
var self = this;
self.tic = '1111111111';
}
//Datenmodell: Order
function Order(from, to){
var self = this;
for(i=0;i<10; i ){
s = (i>=from && i
return s;
}
//12306 Backend
Server = new Server();
//Anfangszustand, der Ticketpool hat 400 volle TicketsServer._init(400);