参考:https://zhuanlan.zhihu.com/p/414572755
一:通用设计
火车售票系统的设计是一个复杂的问题,需要考虑车次、站点、座位、价格、时间以及用户需求等多个维度。系统设计通常包括用户界面、业务逻辑、数据存储等多个部分。下面我将主要讨论数据模型和库存管理。
数据模型
火车售票系统的数据模型需要设计得既能够处理复杂的查询,又能够有效地更新库存。以下是一些主要的实体和关系:
实体:
车次(Train)
车次ID
车次号码
起始站
终点站
发车时间
到达时间
其它车次信息(如车型)
站点(Station)
站点ID
站点名称
站点描述
座位(Seat)
座位ID
车厢号
座位号
座位类型(如硬座、软座、硬卧、软卧)
票价(Price)
价格ID
从站点ID
到站点ID
座位类型
价格
关系:
车次与站点
车次可以停靠多个站点,站点可以被多个车次停靠。
车次与座位
每个车次有多种类型的座位。
票价与车次、站点
票价由车次、起始站和到达站共同决定。
库存设计
库存表的设计是关键,需要能够灵活地处理分站售票的问题。你可以采用“区间库存”模型,即记录每个区间的座位数。
库存表(Inventory):
车次ID
座位类型
出发站点ID
到达站点ID
可用座位数量
库存表的主要操作:
查询操作:用户查询时,需要根据用户的起始站和到达站查询出所有经过这些站点的车次,再根据每个区间的可用座位数量来确定是否有票。
预定操作:当用户预定车票时,系统需要更新所有受影响的区间的库存量。例如,如果用户从北京到上海预定了一张票,那么北京到上海之间的所有区间的可用座位数量都要减一。
取消操作:如果用户取消预定,系统需要将相应区间的可用座位数量加回。
实现注意事项:
事务管理:预定和取消操作涉及多个库存记录的更新,需要保证事务的一致性,防止数据不一致。
并发控制:必须要有适当的并发控制机制,防止多个用户同时预定导致超卖的情况。
数据一致性:在更新库存时,需要保证更新操作的原子性,确保数据的一致性。
性能优化:考虑到火车售票系统可能面临高并发的情况,需要优化数据库的读写性能,可能需要使用缓存、索引、分布式数据库等技术。
分布式系统的考虑:如果系统规模很大,还需要考虑分布式系统的问题,比如数据的分片、负载均衡、容灾备份等。
二:库存站点关系优化
分站售票考虑到出发站点和到达站点问题,如果我买了一站票,可能会update多行,会对系统开销比较大。而且查询的时候也很不方便,确实,如果每个区间都有一行记录,那么预定和查询操作都可能会涉及多行的更新和检索,这在高并发场景下会对性能造成影响。为了优化这个问题,可以考虑以下策略:
位图法(Bitmap)
一种可能的优化方法是使用位图(Bitmap)来表示座位在各个区间的占用情况。每个位代表一个座位的状态(0表示空闲,1表示占用),具体到每个车次,都有一个对应的位图表示所有从发车站到终点站的座位状态。
查询:查询时,只需要检查用户旅程对应区间的位图,通过位运算迅速得知是否有空座。
预定:预定时,更新位图即可,效率较高。
取消:取消时,只需将对应的位重置为0。
区间树(Segment Tree)或线段树数据结构
区间树是一种适合于管理区间的数据结构,它可以有效地解决区间重叠的问题,并且可以快速更新和查询区间的信息。每个树节点表示一个区间,叶节点表示最小的区间(通常是单个站点之间的区间),非叶节点表示由其子节点区间合并而成的更大区间。
查询:查询可以在对数时间内完成,因为只需要遍历树的部分节点即可。
预定:在预定一张票时,只需要更新从根节点到叶节点路径上的所有节点。
取消:取消预定时,更新路径上的节点即可。
基于时间的库存系统
考虑到火车站点之间的区间是固定的,可以使用基于时间的库存系统来跟踪每个区间的座位数。
数据结构:对于每个车次和每种座位类型,维护一个以时间为轴的数组或列表,其中每个元素表示一个出发时间点的座位库存情况。
优化处理:当用户预定票时,系统只需更新用户旅行区间内的时间点的库存,而不必更新整个区间的所有时间点。
缓存和异步处理
对于频繁的操作,可以使用缓存来存储热点数据,比如热门车次的座位信息。同时,可以采用异步处理机制来优化性能:
缓存机制:对于查询操作,可以将热门车次的座位信息缓存在内存中,以减少对数据库的访问。
异步更新:当用户预定或取消票务时,可以先在缓存中更新数据,然后异步地将更新操作批量写入数据库。
分布式系统设计
如果系统需要支持非常大的用户量和数据量,可以考虑使用分布式数据库和服务来分散负载:
数据库分片:将数据分散存储在不同的数据库中,每个数据库只处理一部分区间的数据。
微服务架构:将系统拆分成多个小服务,每个服务负责系统的一部分功能,比如一个服务专门处理票务查询,另一个服务处理订单管理等。
用位图方法较为合适,可以把位图存储在redis当中。每一行代表某个车站的座位信息。