Vi a alguien analizando la lógica del fondo 12306 antes. . La reserva y la suscripción de los boletos de tren es diferente de las compras comunes.
Un problema es que los boletos de tren se pueden vender en diferentes estaciones. Por ejemplo, hay muchas estaciones en el camino para un boleto de tren de Beijing a Shanghai, como Beijing-Jinan, Jinan-Nanjing ... y así sucesivamente. Cómo diseñar un modelo de datos para acceder a estos boletos es un problema. En lugar de una cantidad simple +-1.
Una idea es muy buena: use cuerdas binarias para representar un boleto de tren. Por ejemplo, hay 10 estaciones desde Beijing hasta Shanghai, y el estado inicial de un boleto completo se expresa como: '111111111';
Si se vende un boleto completo, el boleto se convertirá en '000000000';
Si vende un boleto a mitad de camino, como las tres estaciones de Beijing-Jinan (primera estación-tercera estación), el boleto se convertirá en '0011111111';
Si vende otro boleto a mitad de camino, como Xuzhou-Nanjing (detener el 9-stop 9), entonces el boleto anterior se convertirá en: '0011100011';
La lógica de los boletos no suscritos es muy simple. Si quiero reembolsar un boleto (Xuzhou-Nanjing), encontraré el primero del grupo de boletos y no puedo comprarlo.
(Xuzhou-Nanjing) Boleto, cámbielo y está bien (la dirección inversa de la compra de boletos). Por ejemplo, encontré el boleto anterior '0011100011'.
Después de reembolsar el boleto, el boleto se convierte (0011111111);
La lógica básica es la anterior. 12306 debe garantizar múltiples entradas, y la consistencia de los datos al mismo tiempo requiere una lógica muy eficiente para manejar las verificaciones de boletos.
Se dice que habrá 200,000 solicitudes por segundo para la compra de boletos y el reembolso de boletos en las horas pico. Guarde la estructura de datos del ticket en la memoria. No es una base de datos.
Las uniones de datos pequeñas y eficientes se vuelven importantes.
La copia del código es la siguiente:
if (jQuery) {} else {
//document.write
}
function Server () {
var self = this;
self.ticketspool = [];
self._init = function (número) {
if (typeof (número)! = 'número')
lanzar ('Error de tipo de tipo');
para (i = 0; i <número; i ++) {
self.ticketspool.push (nuevo ticket ());
}
};
// Dirección Si se puede comprar un boleto y se puede lograr a través de la operación y la operación.
// Por ejemplo: el pedido O es Beijing-Jinan (001111111), y cierto boleto es (0000000011) (vendido Beijing-Nanjing), luego devuelve False
// Por ejemplo: el pedido O es Beijing-Jinan (001111111), y un cierto boleto es (1111100011) (vendido en Xuzhou-Nanjing), luego regresa verdadero
self.canbuy = function (o, t) {
var _o = ''
para (j = 0; j <o.length; j ++) {
_o += o [j] == '0'? 1: 0;
}
var r1 = (parseInt (t.tic, 2) | parseint (o, 2)) y parseint (_o, 2);
var r2 = parseInt (_o, 2);
return r1 == r2;
};
// vender un boleto
self.pop1Ticket = function (o) {
para (i = 0; i <self.ticketspool.length; i ++) {
if (self.canbuy (o, self.ticketspool [i])) {
self.buy (self.ticketspool [i], o);
regresar i;
}
};
regreso -1;
};
// Implementación de los boletos de venta, cambiando la cadena binaria, como '11111111'-> '00111111';
self.buy = function (t, o) {
T.TIC = (parseint (T.Tic, 2) y Parseint (O, 2)). Tostring (2);
//alert(t.tic);
};
// Consulta de los boletos restantes
self.remaintics = function (o) {
Var Count = 0;
para (i = 0; i <self.ticketspool.length; i ++) {
count += self.canbuy (o, self.ticketspool [i])? 1: 0;
};
recuento de retorno;
}
// reembolso u operación
self.refund = function (o) {
para (i = 0; i <self.ticketspool.length; i ++) {
if (! self.canbuy (o, self.ticketspool [i])) {
var _o = ''
para (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);
regresar i;
}
};
regreso -1;
}
}
// Modelo de datos: boletos
function ticket () {
var self = this;
// El boleto es el comienzo del boleto
self.tic = '1111111111';
}
// Modelo de datos: pedido
orden de funciones (de, a) {
var self = this;
var s = '';
para (i = 0; i <10; i ++) {
s += (i> = from && i <to)? 0: 1;
}
regreso s;
}
// 12306 Backstage
Servidor = nuevo servidor ();
// Estado inicial, el grupo de entradas tiene 400 boletos completos
Servidor._init (400);