Я видел, как кто -то раньше анализировал логику 12306 года. Полем Бронирование и отмену билетов на поезда отличаются от обычных покупок.
Одна из проблем заключается в том, что билеты на поезд могут быть проданы на разных станциях. Например, на этом пути есть много станций для билета на поезд из Пекина в Шанхай, такие как Пекин-джиннин, Джинань-Наньцлин ... и так далее. Как разработать модель данных для доступа к этим билетам является проблемой. Вместо простого количества +-1.
Одна идея очень хорошая: используйте двоичные струны, чтобы представлять билет поезда. Например, существует 10 станций от Пекина до Шанхая, и начальный статус полного билета выражается как: '111111111';
Если будет продан полный билет, билет станет «000000000»;
Если вы продаете билет на полпути, такой как три станции в Пекинг-джинане (первая станция-третья станция), билет станет «0011111111»;
Если вы продаете еще один на полпути, такой как Xuzhou-nanjing (остановка 6-стоп 9), то предыдущий билет станет: '0011100011';
Логика неопозиционных билетов очень проста. Если я хочу вернуть билет (Xuzhou-nanjing), я найду первый из пула билетов и не смогу его купить.
(Xuzhou-nanjing) Билет, измените его, и все в порядке (обратное направление покупки билетов). Например, я нашел приведенный выше билет 0011100011 '.
После возмещения билета билет становится (0011111111);
Основная логика, как указано выше. 12306 должен обеспечить несколько входов, а согласованность данных одновременно требует очень эффективной логики для обработки проверки билетов.
Говорят, что в пиковые времена будет 200 000 запросов в секунду на покупку билетов и возврат билетов. Сохраните структуру данных билета в памяти. Не база данных.
Небольшие и эффективные соединения данных становятся важными.
Кода -копия выглядит следующим образом:
if (jQuery) {} else {
//document.write
}
функциональный сервер () {
var self = это;
self.ticketspool = [];
self._init = function (номер) {
if (typeof (номер)! = 'Номер')
throw ('type error');
for (i = 0; i <number; i ++) {
self.ticketspool.push (новый билет ());
}
};
// направление, можно ли купить билет, и он может быть достигнут через и или операцию.
// Например: заказ o-Пекинг-дзинань (0011111111), а определенный билет-(0000000011) (проданный Пекин-Наньцин), затем верните ложный
// Например: заказ o-Пекинг-дзинань (001111111), а определенный билет (1111100011) (продается в Xuzhou-nanjing), затем верните True
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)) & 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);
вернуть я;
}
};
возврат -1;
};
// реализация продажи билетов, изменение двоичной строки, такую как «111111111»-> '00111111';
self.buy = function (t, o) {
t.tic = (parseint (t.tic, 2) & parseint (o, 2)). Tostring (2);
//alert(t.tic);
};
// запрос оставшихся билетов
self.remaintics = function (o) {
var count = 0;
for (i = 0; i <self.ticketspool.length; i ++) {
count += self.canbuy (o, self.ticketspool [i])? 1: 0;
};
возврат подсчет;
}
// Возврат или операция
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 <o.length; j ++) {
_o += o [j] == '0'? 1: 0;
}
self.ticketspool [i] .tic = (parseint (self.ticketspool [i] .tic, 2) | parseint (_o, 2)). Tostring (2);
вернуть я;
}
};
возврат -1;
}
}
// Модель данных: билеты
функциональный билет () {
var self = это;
// билет - начало билета
self.titic = '1111111111';
}
// Модель данных: заказ
порядок функции (от, до) {
var self = это;
var s = '';
for (i = 0; i <10; i ++) {
s += (i> = from && i <to)? 0: 1;
}
возврат S;
}
// 12306 за кулисами
Server = new Server ();
// начальный статус, пул билетов имеет 400 полных билетов
Server._init (400);