我看到有人分析了12306个背景的逻辑,火车票的保留和提取不同于一般的购物。
一个问题是火车票可以在车站出售,例如,从北京到上海的火车票沿途有很多车站,可以是北京、济南、济南、南京等,如何设计一个访问这些票的数据模型是一个问题,而不是简单的+ 1。

看到它的一种方法是好的:二进制字符串用于表示火车票,例如,从北京到上海有10站,因此整个票初始状态表示为:1111111111。
卖全价票,票是0000000000元。
卖了一半的票,如北京-济南三站(第一-第三站),然后'0011111111的票;
卖了一半的票,如徐州-南京(第六站,第九站),然后最后一张票改为:'0011100011;

保留的逻辑很简单。我想退一张票(徐州-南京),从售票处找到第一张票。
(徐州-南京)票,换成OK(票的反面)。例如,找到一个票'0011100011'above。
退票后,机票改为(0011111111);

上面的基本逻辑,12306为了保证一致性和入口性,同时数据,你需要一个非常有效的逻辑来处理票,
买票和回程票的业务据说在高峰时每秒钟有20万次请求。把机票的数据结构保存在内存中,而不是数据库。
小而有效的数据节点是重要的。
复制代码代码如下所示:
如果(jQuery){其他{
/ /段
}

函数服务器(){
var =;

self.ticketspool = { };

自我。_init =函数(数){
如果(typeof(数)!=数)
把(错误);
对于(i = 0;i <数字;i + +){
Self.ticketsPool.push(新的票());
}
};

确定是否可以购买门票,或通过操作来实现。
例如:北京的订单O -济南(001111111),一张票(00000000 11)(在北京-南京销售),然后返回false。
例如:北京的订单O -济南(001111111),一张(11111 00011)(在徐州-南京销售)的票,然后返回true。
self.canbuy =函数(0,T){
无功_o =
为(J = 0;J < o.length;j++){
_o = O { } = = 0 '1:0 {J}.;
}
var = R1(parseInt(t.tic,2)| parseInt(O,2))parseInt(_o,2);
VaR R2 = parseInt(_o,2);
返回R2 = R2;
};

卖票
self.pop1ticket =功能(o){
为(i = 0;i < self.ticketspool.length;i++){
如果(self.canbuy(O,自我。ticketspool {我})){
Self.buy(自我。ticketspool {我},O);
还我;
}
};
返回- 1;
};

实现 / /卖门票,改变二进制字符串,如111111111> '001111111;
self.buy =功能(T O){
t.tic =(parseInt(t.tic,2)parseInt(O,2)),ToString(2);
/ /警报(t.tic);

};

查询票
self.remaintics =功能(o){
var计数= 0;
为(i = 0;i < self.ticketspool.length;i++){
数= self.canbuy(O,自我。ticketspool {我})1:0;
};
返回计数;
}

或退款或操作
self.refund =功能(o){
为(i = 0;i < self.ticketspool.length;i++){
如果(!Self.canBuy(O,自我。ticketspool {我})){
无功_o =
为(J = 0;J < o.length;j++){
_o = O { } = = 0 '1:0 {J}.;
}
自我。ticketspool {我}。TiC =(parseInt(自我。ticketspool {我},TiC,2)| parseInt(_o,2)),ToString(2);
还我;
}
};

返回- 1;
}
}

门票: / /数据模型
函数票(){
var =;
最初的全票价票
self.tic =1111111111;
}

数据模型:订单
函数顺序(从,到){
var =;
var=;
对于(i = 0;i < 10;i + +){
S = 0:1(我=我<);
}
返回的;
}

12306后台
服务器=新服务器();
/初始状态,有400个全票价票池。
(400)_init服务器;