Eu vi alguém analisando a lógica do fundo 12306 antes. . Reservar e cancelar a inscrição de bilhetes de trem são diferentes das compras comuns.
Um problema é que os bilhetes de trem podem ser vendidos em diferentes estações. Por exemplo, existem muitas estações ao longo do caminho para uma passagem de trem de Pequim a Xangai, como Pequim-Jinan, Jinan-Nanjing ... e assim por diante. Como projetar um modelo de dados para acessar esses ingressos é um problema. Em vez de uma quantidade simples +-1.
Uma idéia é muito boa: use strings binários para representar uma passagem de trem. Por exemplo, existem 10 estações de Pequim a Xangai, e o status inicial de um bilhete completo é expresso como: '1111111111';
Se um bilhete completo for vendido, o bilhete se tornará '000000000';
Se você vender um bilhete de meio caminho, como três estações de Pequim-Jinan (primeira estação da estação), o bilhete se tornará '001111111111';
Se você vender outro bilhete de meio caminho, como Xuzhou-Nanjing (pare de 6-Stop 9), o ingresso anterior se tornará: '0011100011';
A lógica dos ingressos não inscritos é muito simples. Se eu quiser reembolsar um ingresso (Xuzhou-Nanjing), encontrarei o primeiro do pool de ingressos e não posso comprá-lo.
(Xuzhou-nanjing) Ticket, altere-o e está tudo bem (a direção inversa de comprar ingressos). Por exemplo, encontrei o ticket acima '0011100011'.
Após o reembolso do bilhete, o ticket se torna (0011111111);
A lógica básica é como acima. 12306 deve garantir várias entradas e a consistência dos dados ao mesmo tempo requer lógica muito eficiente para lidar com as verificações de ingressos.
Dizem que haverá 200.000 solicitações por segundo para compra de ingressos e reembolso de ingressos nos horários de pico. Salve a estrutura de dados do ticket na memória. Não é um banco de dados.
Junções de dados pequenas e eficientes se tornam importantes.
A cópia do código é a seguinte:
if (jQuery) {} else {
//document.write
}
function server () {
var self = this;
self.Ticketspool = [];
self._init = function (número) {
if (typeof (número)! = 'número')
arremesso ('erro de tipo');
for (i = 0; i <número; i ++) {
self.ticketspool.push (novo ticket ());
}
};
// Direção se um ticket pode ser comprado e pode ser alcançado através da e/ou de operação.
// Por exemplo: Ordem O é Pequim-Jinan (0011111111) e um determinado bilhete é (0000000011) (vendido Pequim-Nanjing), depois retornar
// Por exemplo: Ordem O é Pequim-Jinan (0011111111), e um determinado bilhete é (1111100011) (vendido em Xuzhou-Nanjing), depois retorne verdadeiro
self.canbuy = function (o, t) {
var _o = ''
for (j = 0; j <o.length; j ++) {
_o += o [j] == '0'? 1: 0;
}
var r1 = (parseint (t.tic, 2) | parseint (o, 2)) e parseint (_o, 2);
var r2 = parseint (_o, 2);
return r1 == r2;
};
// Vender um ingresso
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);
retornar i;
}
};
retornar -1;
};
// Implementação de ingressos de venda, alterando a sequência binária, como '11111111'-> '00111111';
self.buy = function (t, o) {
t.tic = (parseint (t.tic, 2) e parseint (O, 2)). ToString (2);
//alert(t.tic);
};
// consulta dos ingressos restantes
self.remaintics = function (o) {
var count = 0;
for (i = 0; i <self.Ticketspool.length; i ++) {
count += self.CanBuy (o, self.Ticketspool [i])? 1: 0;
};
contagem de retorno;
}
// reembolso ou operação
self.refund = function (o) {
for (i = 0; i <self.Ticketspool.length; i ++) {
if (! self.anbuy (o, self.ticketspool [i])) {
var _o = ''
for (j = 0; j <o.length; j ++) {
_o += o [j] == '0'? 1: 0;
}
self.Ticketspool [i] .t = (parseint (self.Ticketspool [i] .t, 2) | parseint (_o, 2)). ToString (2);
retornar i;
}
};
retornar -1;
}
}
// Modelo de dados: tickets
Função Ticket () {
var self = this;
// O ingresso é o começo do bilhete
self.tic = '1111111111';
}
// Modelo de dados: Ordem
Ordem de função (de, para) {
var self = this;
var s = '';
para (i = 0; i <10; i ++) {
s += (i> = de && i <para)? 0: 1;
}
retorno s;
}
// 12306 nos bastidores
Servidor = new Server ();
// status inicial, o pool de ingressos tem 400 ingressos completos
Server._init (400);