Ich habe jemanden zuvor gesehen, der die Logik des 12306 -Hintergrunds analysierte. . Die Buchung und Abmeldung von Zugkarten unterscheidet sich von normalen Einkaufsmöglichkeiten.
Ein Problem ist, dass Zugkarten an verschiedenen Stationen verkauft werden können. Zum Beispiel gibt es viele Stationen auf dem Weg für ein Zugticket von Peking nach Shanghai wie Peking-Jinan, Jinan-Nanjing ... und so weiter. Das Entwerfen eines Datenmodells zum Zugriff auf diese Tickets ist ein Problem. Anstelle einer einfachen Menge +-1.
Eine Idee ist sehr gut: Verwenden Sie binäre Zeichenfolgen, um ein Zugticket zu repräsentieren. Zum Beispiel gibt es 10 Stationen von Peking nach Shanghai, und der anfängliche Status eines Vollständigen wird als "111111111" ausgedrückt;
Wenn ein vollständiges Ticket verkauft wird, wird das Ticket "000000000".
Wenn Sie ein Halbzeit-Ticket wie Peking-Jinan drei Stationen (erster Bahnhofsstation) verkaufen, wird das Ticket zu einer 001111111111;
Wenn Sie ein weiteres Halbwegs-Ticket wie Xuzhou-Nanjing (Stop 6-Stop 9) verkaufen, wird das vorherige Ticket: '0011100011';
Die Logik der nicht subikulierten Tickets ist sehr einfach. Wenn ich ein Ticket (Xuzhou-Nanjing) zurückerstatten möchte, werde ich den ersten aus dem Ticketpool finden und kann es nicht kaufen.
(Xuzhou-Nanjing) Ticket, ändern Sie es und es ist in Ordnung (die umgekehrte Richtung des Kaufs von Tickets). Zum Beispiel fand ich das obige Ticket '0011100011'.
Nach der Rückerstattung des Tickets wird das Ticket (0011111111);
Die grundlegende Logik ist wie oben. 12306 muss mehrere Eingänge sicherstellen, und die gleichzeitige Konsistenz von Daten erfordert eine sehr effiziente Logik, um Ticketprüfungen zu verarbeiten.
Es wird gesagt, dass es 200.000 Anfragen pro Sekunde für den Kauf und die Rückerstattung von Tickets zu Spitzenzeiten geben wird. Speichern Sie die Datenstruktur des Tickets im Speicher. Keine Datenbank.
Kleine und effiziente Datenübergänge werden wichtig.
Die Codekopie lautet wie folgt:
if (jQuery) {} else {
//document.write
}
Funktion Server () {
var self = this;
self.ticketSpool = [];
self._init = function (number) {
if (typeof (number)! = 'number')
throw ('Typ -Fehler');
für (i = 0; i <nummer; i ++) {
self.ticketspool.push (neuer Ticket ());
}
};
// Richtung, ob ein Ticket gekauft werden kann und es über den und/oder Betrieb erreicht werden kann.
// Zum Beispiel: Bestellung O Is Peking-Jinan (0011111111), und ein bestimmtes Ticket ist (0000000011) (verkauft bei Peking-Nanjing), und geben Sie dann false zurück
// Zum Beispiel: Bestellung O Is Peking-Jinan (0011111111), und ein bestimmtes Ticket ist (1111100011) (verkauft in Xuzhou-Nanjing), dann kehren Sie dann wahr zurück
self.canbuy = function (o, t) {
var _o = ''
für (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;
};
// ein Ticket verkaufen
self.pop1ticket = function (o) {
für (i = 0; i <self.ticketspool.length; i ++) {
if (self.canbuy (o, self.ticketspool [i])) {
self.buy (self.ticketspool [i], o);
kehre I zurück;
}
};
Return -1;
};
// Implementierung von Verkauf von Tickets, Änderung der binären Zeichenfolge wie '11111111'-> '00111111';
self.buy = function (t, o) {
t.tic = (parseInt (t.tic, 2) & parseInt (o, 2)). tostring (2);
//alert(t.tic);
};
// Anfrage der verbleibenden Tickets
self.Remaintics = Funktion (o) {
var count = 0;
für (i = 0; i <self.ticketspool.length; i ++) {
count += self.canbuy (o, self.ticketspool [i])? 1: 0;
};
Rückgabezahl;
}
// Rückerstattung oder Betrieb
self.refund = function (o) {
für (i = 0; i <self.ticketspool.length; i ++) {
if (! self.canbuy (o, self.ticketspool [i])) {
var _o = ''
für (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);
kehre I zurück;
}
};
Return -1;
}
}
// Datenmodell: Tickets
Funktion Ticket () {
var self = this;
// Das Ticket ist der Beginn des Tickets
self.tic = '1111111111';
}
// Datenmodell: Reihenfolge
Funktionsreihenfolge (von, bis) {
var self = this;
var s = '';
für (i = 0; i <10; i ++) {
s += (i> = von && i <zu)? 0: 1;
}
Rückkehr s;
}
// 12306 Backstage
Server = neuer Server ();
// Erststatus hat der Ticketpool 400 Vollkarten
Server._init (400);