J'ai vu quelqu'un analyser la logique de l'arrière-plan 12306 auparavant. . La réservation et le désabonnement des billets de train sont différents des achats ordinaires.
Un problème est que les billets de train peuvent être vendus dans différentes stations. Par exemple, il existe de nombreuses stations en cours de route pour un billet de train de Pékin à Shanghai, comme Pékin-Jinan, Jinan-Nanjing ... et ainsi de suite. Comment concevoir un modèle de données pour accéder à ces billets est un problème. Au lieu d'une quantité simple + -1.
Une idée est très bonne: utilisez des chaînes binaires pour représenter un billet de train. Par exemple, il y a 10 stations de Pékin à Shanghai, et le statut initial d'un billet complet est exprimé: «111111111»;
Si un billet complet est vendu, le billet deviendra «000000000»;
Si vous vendez un billet à mi-chemin, comme Pékin-Jinan trois stations (première station-troisième station), le billet deviendra «0011111111»;
Si vous vendez un autre billet à mi-chemin, comme Xuzhou-Nanjing (Stop 6-Stop 9), alors le billet précédent deviendra: «0011100011»;
La logique des billets non abonnés est très simple. Si je veux rembourser un billet (Xuzhou-Nanjing), je trouverai le premier du bassin de billets et je ne peux pas l'acheter.
(Xuzhou-Nanjing) Ticket, changez-le et c'est OK (la direction inverse de l'achat de billets). Par exemple, j'ai trouvé le billet ci-dessus «0011100011».
Après le remboursement du billet, le billet devient (0011111111);
La logique de base est comme ci-dessus. 12306 doit garantir plusieurs entrées et la cohérence des données en même temps nécessite une logique très efficace pour gérer les vérifications des billets.
On dit qu'il y aura 200 000 demandes par seconde pour l'achat de billets et le remboursement des billets aux heures de pointe. Enregistrez la structure de données du ticket en mémoire. Pas une base de données.
Les jonctions de données petites et efficaces deviennent importantes.
La copie de code est la suivante:
if (jQuery) {} else {
//document.write
}
fonction Server () {
var self = this;
self.TicketSpool = [];
self._init = fonction (nombre) {
if (typeof (nombre)! = 'nombre')
Throw ('Type Error');
for (i = 0; i <nombre; i ++) {
self.ticketspool.push (nouveau ticket ());
}
};
// Direction, si un billet peut être acheté, et il peut être réalisé grâce à l'opération et ou à l'opération.
// Par exemple: la commande o est Pékin-Jinan (001111111), et un certain billet est (0000000011) (vendu à Beijing-Nanjing), puis retourne false
// Par exemple: l'ordre O est Beijing-Jinan (001111111), et un certain billet est (1111100011) (vendu dans Xuzhou-Nanjing), puis retourne vraie
self.canBuy = fonction (o, t) {
var _o = ''
pour (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);
retour r1 == r2;
};
// vend un billet
self.pop1Ticket = fonction (o) {
for (i = 0; i <self.ticketspool.length; i ++) {
if (self.canBuy (o, self.ticketspool [i])) {
self.buy (self.ticketspool [i], o);
retour i;
}
};
retour -1;
};
// implémentation de la vente de billets, modifiant la chaîne binaire, telle que '11111111' -> '00111111';
self.buy = fonction (t, o) {
t.tic = (parseInt (t.tic, 2) & parseInt (o, 2)). toString (2);
//alert(t.tic);
};
// Enquête des billets restants
self.remaintics = fonction (o) {
Var Count = 0;
for (i = 0; i <self.ticketspool.length; i ++) {
Count + = self.CanBuy (o, self.ticketspool [i])? 1: 0;
};
Return Count;
}
// remboursement ou opération
self.refund = fonction (o) {
for (i = 0; i <self.ticketspool.length; i ++) {
if (! self.canbuy (o, self.ticketspool [i])) {
var _o = ''
pour (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);
retour i;
}
};
retour -1;
}
}
// Modèle de données: billets
Ticket de fonction () {
var self = this;
// Le billet est le début du billet
self.tic = '1111111111';
}
// Modèle de données: commande
Ordre de fonction (de, à) {
var self = this;
var s = '';
pour (i = 0; i <10; i ++) {
S + = (i> = de && i <à)? 0: 1;
}
retour s;
}
// 12306 dans les coulisses
Server = new server ();
// Statut initial, le pool de billets dispose de 400 billets complets
Server._init (400);