J'ai déjà vu quelqu'un analyser la logique backend de 12306. . La réservation et l'annulation de billets de train sont différentes des achats ordinaires.
Un problème est que les billets de train peuvent être vendus dans différentes gares. Par exemple, un billet de train de Pékin à Shanghai peut comporter de nombreux arrêts en cours de route, comme Pékin-Jinan, Jinan-Nanjing... et ainsi de suite. Comment concevoir un modèle de données pour accéder à ces tickets est un problème. Au lieu d'une simple quantité -1.
J'ai vu une bonne idée parmi eux : utiliser une chaîne binaire pour représenter un billet de train. Par exemple, il y a 10 gares au total de Pékin à Shanghai, alors l'état initial d'un billet longue distance est : '1111111111'. ;
Vendre Si vous achetez un billet pour un trajet complet, le billet devient '0000000000'
Si vous vendez un billet pour un demi-trajet, comme Pékin-Jinan trois stations (premier arrêt - troisième arrêt), le billet deviendra '0011111111';
Si vous vendez un autre billet demi-distance, comme Xuzhou-Nanjing (arrêt 6-9), le billet précédent deviendra : '0011100011';
La logique de l'annulation d'un billet est très simple. Si je souhaite rembourser un billet (Xuzhou-Nanjing), je trouverai le premier billet du pool de billets qui ne peut pas être acheté
(Xuzhou-Nanjing) et je le changerai. OK (l'inverse de l'achat d'un billet). Par exemple, si vous trouvez le billet ci-dessus '0011100011',
après le remboursement, le billet devient (0011111111) ;
On dit que l'activité d'achat et de remboursement des billets connaît un pic. de 200 000 requêtes par seconde. Enregistrez la structure des données du ticket en mémoire. plutôt qu'une base de données.
Les structures de données petites et efficaces deviennent importantes.
var self = this;
self._init= function(number){
if(typeof(number) != 'number')
throw ('type error');
for(i=0;i
}
};
//Par exemple : la commande o est Pékin-Jinan (001111111), et un certain billet est (0000000011) (Pékin-Nanjing a été vendu), puis renvoie faux
//Par exemple : la commande o est Pékin -Jinan ( 001111111), un certain billet est (1111100011) (vendu Xuzhou-Nanjing), puis renvoie 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;
};
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;
};
self.buy = function(t,o){
t.tic = (parseInt (t.tic,2) & parseInt(o,2)).toString(2);
//alert(t.tic);
//Requête des billets restants
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
}
self.ticketsPool[i].tic = (parseInt(self.ticketsPool[i].tic,2) | parseInt(_o,2)).toString(2 );
retourner i;
}
};
}
>
function Ticket(){
var self = this;
//Le ticket initial est un ticket complet
self.tic = '1111111111';
>
fonction Commande(de, à){
var self = this;
var s = '';
for(i=0;i<10; i ){
s = (i>=from && i
return s;
}
Server = new Server();
//État initial, le pool de tickets contient 400 tickets complets
Server._init(400);