Saya melihat seseorang menganalisis logika latar belakang 12306 sebelumnya. . Pemesanan dan berhenti berlangganan tiket kereta api berbeda dari belanja biasa.
Satu masalah adalah bahwa tiket kereta dapat dijual di stasiun yang berbeda. Misalnya, ada banyak stasiun di sepanjang jalan untuk tiket kereta api dari Beijing ke Shanghai, seperti Beijing-Jinan, Jinan-Nanjing ... dan sebagainya. Cara merancang model data untuk mengakses tiket ini adalah masalah. Alih-alih kuantitas sederhana +-1.
Satu ide sangat bagus: Gunakan string biner untuk mewakili tiket kereta api. Misalnya, ada 10 stasiun dari Beijing ke Shanghai, dan status awal tiket penuh dinyatakan sebagai: '111111111';
Jika tiket lengkap dijual, tiket akan menjadi '000000000';
Jika Anda menjual tiket setengah jalan, seperti Beijing-Jinan tiga stasiun (stasiun stasiun pertama), tiket akan menjadi '0011111111';
Jika Anda menjual tiket setengah jalan lagi, seperti Xuzhou-Nanjing (hentikan 6-stop 9), maka tiket sebelumnya akan menjadi: '0011100011';
Logika tiket yang tidak berlangganan sangat sederhana. Jika saya ingin mengembalikan tiket (Xuzhou-Nanjing), saya akan menemukan yang pertama dari kumpulan tiket dan tidak dapat membelinya.
(Xuzhou-nanjing) tiket, ubah dan tidak apa-apa (arah terbalik membeli tiket). Misalnya, saya menemukan tiket di atas '0011100011'.
Setelah mengembalikan tiket, tiket menjadi (0011111111);
Logika dasar adalah seperti di atas. 12306 harus memastikan beberapa pintu masuk, dan konsistensi data pada saat yang sama membutuhkan logika yang sangat efisien untuk menangani pemeriksaan tiket.
Dikatakan bahwa akan ada 200.000 permintaan per detik untuk pembelian tiket dan pengembalian tiket pada waktu puncak. Simpan struktur data tiket dalam memori. Bukan database.
Persimpangan data kecil dan efisien menjadi penting.
Salinan kode adalah sebagai berikut:
if (jQuery) {} else {
//document.write
}
server fungsi () {
var self = ini;
self.ticketspool = [];
self._init = function (angka) {
if (typeof (number)! = 'number')
throw ('type error');
untuk (i = 0; i <number; i ++) {
self.ticketspool.push (tiket baru ());
}
};
// Arah apakah tiket dapat dibeli, dan dapat dicapai melalui dan atau operasi.
// Misalnya: Pesan O adalah Beijing-Jinan (001111111), dan tiket tertentu adalah (0000000011) (dijual Beijing-nanjing), lalu kembali salah
// Misalnya: Pesan O adalah Beijing-Jinan (001111111), dan tiket tertentu adalah (1111100011) (dijual di Xuzhou-Nanjing), lalu kembali true
self.canbuy = function (o, t) {
var _o = ''
untuk (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;
};
// Jual tiket
self.pop1ticket = function (o) {
untuk (i = 0; i <self.ticketspool.length; i ++) {
if (self.canbuy (o, self.ticketspool [i])) {
self.buy (self.ticketspool [i], o);
Kembalikan i;
}
};
kembali -1;
};
// Implementasi Penjualan Tiket, Mengubah String Biner, seperti '11111111'-> '00111111';
self.buy = function (t, o) {
t.tic = (parseInt (t.tic, 2) & parseInt (o, 2)). Tostring (2);
//alert(t.tic);
};
// Pertanyaan tiket yang tersisa
self.remaincs = function (o) {
var count = 0;
untuk (i = 0; i <self.ticketspool.length; i ++) {
hitung += self.canbuy (o, self.ticketspool [i])? 1: 0;
};
jumlah pengembalian;
}
// pengembalian dana, atau operasi
self.refund = function (o) {
untuk (i = 0; i <self.ticketspool.length; i ++) {
if (! self.canbuy (o, self.ticketspool [i])) {
var _o = ''
untuk (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);
Kembalikan i;
}
};
kembali -1;
}
}
// Model Data: Tiket
function ticket () {
var self = ini;
// Tiket adalah awal dari tiket
self.tic = '1111111111';
}
// Model Data: Pesanan
urutan fungsi (dari, ke) {
var self = ini;
var s = '';
untuk (i = 0; i <10; i ++) {
s += (i> = dari && i <to)? 0: 1;
}
kembali S;
}
// 12306 Backstage
Server = server baru ();
// Status awal, kumpulan tiket memiliki 400 tiket penuh
Server._init (400);