春运一票难求,候补抢票显威,如何设计一个候补订单系统?

春运一票难求,候补官方抢票

最近春节火车一票难求,12306系统的候补购票是一种官方支持的抢票方式。在首日票已售罄时,立即提交候补请求,系统会优先考虑候补乘客的需求。根据成功率灵活选择是否候补购票。

当旅客在12306网站购票,输入乘车日期、发到站等信息查询没有余票时,页面会在相关车次的席别余票显示列表中出现“候补”字样,旅客可根据需求点击相应车次、席别对应的“候补”区域,系统将该需求自动加入当前候补购票需求列表。候补订单提交成功后需在30分钟内完成支付,完成候补预付款支付后,候补购票订单立即生效。候补购票订单生效后,相关候补需求不可修改,如需变更,可终止订单后重新操作。兑现时,按照候补订单生效的时间顺序,优先兑现符合条件的候补需求。预付款按该单不同组合需求中票款的最高额度计算(卧铺按下铺票价计算)。

候补订单系统该如何设计?

那么如何设计一个12306火车票候补功能的系统呢?设计一个12306火车票候补功能的系统我们需要考虑的主要模块包括乘客候补系统、车票余量监控、排队、通知机制以及支付与出票等核心环节。以下是一种简化的系统设计概述:

图片

1. 乘客候补订单模块

• 用户提交候补请求:允许用户对已经售罄的车次座位发起候补申请,包含乘车人信息、日期、车次、席别等必要信息。

• 候补队列建立:系统将所有候补请求按照一定的优先级策略(如购票时间先后、会员等级等)排序,形成候补队列。

2. 支付模块

• 候补订单申请成功后,用户在接到通知后,应在规定时间内完成支付。

• 支付成功后需要将消息推送到候补订单模块,候补订单根据规则排序建立候补队列。

3. 车票余量监控模块

• 实时对接12306票务数据库,监控各车次的退票、改签动态,实时更新车票剩余情况。

• 当有乘客退票或者改签导致座位空缺时,触发候补队列处理机制。

4. 候补处理模块

• 根据车票余量变化,自动从候补队列中选择符合条件的候补乘客,为其生成车票。

• 成功分配车票的候补请求移除出队列,未成功分配的则继续保留等待。

5. 出票模块

• 候补订单处理后,系统立即执行出票操作,将电子客票信息更新至乘客账户,并可下载电子凭证。

通过以上模块,构建一个高效、稳定、透明的火车票候补系统,既能有效利用票源,又能提升用户体验。

那么不同的车次、订票日期、坐席、出站、候补人数组合在一起后传统的消息队列可能无法满足我们的需求了。下面拿G521列车举个例子:

图片

这是一个开往武汉的高铁,假如我们要在2024-02-08这天要到郑州,票没有了,我们候补订单候补了3个人,那么这个队列该怎么存放呢?

图片

我们可以简单想下一个队列能够快速的根据车次、订票日期、坐席、出站、候补人数组合等信息快速找到队列,并消费。传统数据库无法满足这种高并发的需求,REDIS的list貌似可以试下,如果我想对某个车次+日期查询队列情况(超过一定数量,提示用户不要排队了)又不太方便,这时hash+list的组合就比较合适了。下面我们看下详细设计。

如何使用redis的hash+list实现候补队列

我们使用 Redis 的 Hash 结构来实现根据车次、车站、日期、乘车人数设计一个队列。每个车次及时间作为一个 key,车站和乘车人数作为 field,对应的值是一个队列,存放候补订单。当某个车次到某个车站有票时,可以遍历这个 key 及 field,找到第一个队列进行消费。以下是具体的设计方案:

图片

1. Redis Hash 结构

Key: train:{train_number}:{date}
Field: {station}_{passenger_count}
Value: 候补订单队列

2. 举例

假设 G521 车次,日期为 2024-02-08,有 3 个乘客,站台为 郑州。

Key: train:G520:2024-02-08
Field: 郑州_二等座_1
Value: [候补订单1, 候补订单2, 候补订单3, ...]

3. 消费逻辑

当某个车次到达某个车站有票时,我们可以按遍历该车次在该日期下的 Hash 结构的 field,如果很多票我们选择优先消费field=郑州_二等座_3的队列,如果只有一张票我们只能消费郑州_二等座_1的队列。当然还需要结合候补时间判断。

总结

1. Hash 结构设计: 使用 Hash 结构来存储车次、日期、车站、乘车人数等信息,便于查询和管理。

2. 队列存储候补订单: 在 Hash 结构的 field 中存储候补订单队列,便于根据车站和乘车人数索引订单。

3. 消费逻辑: 当某个车次到达某个车站有票时,遍历相应的 Hash 结构,找到一个非空队列进行消费。

通过以上设计,我们可以根据车次、车站、日期、乘车人数设计一个队列,并通过 Redis 的 Hash 结构实现,保证了订单信息的管理和处理的高效性和可靠性。想想一些平台的排队功能是不是也可以这么搞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/466703.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【程序设计竞赛】竞赛中的细节优化

必须强调下,以下的任意一种优化,都应该是在本身采用的算法没有任何问题情况下的“锦上添花”,而不是“雪中送炭”。 如果下面的说法存在误导,请专业大佬评论指正 读写优化 C读写优化——解除流绑定 在ACM里,经常出现…

Spring Cloud Gateway 网关路由

一、路由断言 路由断言就是判断路由转发的规则 二、路由过滤器 1. 路由过滤器可以实现对网关请求的处理,可以使用 Gateway 提供的,也可以自定义过滤器 2. 路由过滤器 GatewayFilter(默认不生效,只有配置到路由后才会生效&#x…

《CSS 简易速速上手小册》第3章:CSS 响应式设计(2024 最新版)

文章目录 3.1 媒体查询基础:网页的智能眼镜3.1.1 基础知识3.1.2 重点案例:适应三种设备的响应式布局3.1.3 拓展案例 1:改变字体大小3.1.4 拓展案例 2:暗模式适配 3.2 响应式图片和视频:让内容自由呼吸3.2.1 基础知识3.…

线性代数的本质——1 向量

向量是线性代数中最为基础的概念。 何为向量? 从物理上看, 向量就是既有大小又有方向的量,只要这两者一定,就可以在空间中随便移动。 从计算机应用的角度看,向量和列表很接近,可以用来描述某对象的几个不同…

力扣刷题之旅:高阶篇(五)—— 网络流算法:最大流与最小割

力扣(LeetCode)是一个在线编程平台,主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目,以及它们的解题代码。 --点击进入刷题地址 引言 在算法领域中,网络流算法是一个重要且实用的工…

Python使用kruskal算法实现最小生成树

假如有多台计算机组成的局域网,不同计算机之间是使用光纤来连接的,如果把计算机看成是一个简单的节点,连接计算机的光纤看成是一条边,那这个局域网就可以抽象成为一个无向图: 添加图片注释,不超过 140 字(可选) 而对于这个图中的每个圆圈代表的是一个计算机,直线代表…

【北邮鲁鹏老师计算机视觉课程笔记】06 corner 局部特征

【北邮鲁鹏老师计算机视觉课程笔记】06 corner 局部特征 1 局部特征的任务牵引:全景拼接 ①提取特征 ②匹配特征 ③拼接图像 我们希望特征有什么特性? ①可重复性 ②显著性 ③计算效率和表达紧凑性 ④局部性 2 特征点检测的任务 3 角点 在角点&#…

Python爬虫之Ajax数据爬取基本原理

前言 有时候我们在用 requests 抓取页面的时候,得到的结果可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据,但是使用 requests 得到的结果并没有。这是因为 requests 获取的都是原始的 HTML 文档,而浏览器中…

Kafka 之生产者(Producer)

目录 一. 前言 二. 生产消息 三. 幂等和事务 四. send() 发送消息 五. 原理解析 一. 前言 Kafka生产者是一个应用程序,它负责向 Kafka 主题发送消息。这些消息可以用于多种目的,如记录用户活动、收集物联网设备数据、保存日志消息或缓存即将写入数据…

去空行小工具Html + Javascript

这是一个平常用到的小工具&#xff0c;为了节省屏幕空间把空行去掉&#xff0c;为了怕要用的时候找不到故记录在此。 效果图 网页版&#xff0c;放在浏览器里就可以用 <!doctype html> <html><head><meta charset"utf-8"><title>去…

java微服务面试篇

目录 目录 SpringCloud Spring Cloud 的5大组件 服务注册 Eureka Nacos Eureka和Nacos的对比 负载均衡 负载均衡流程 Ribbon负载均衡策略 自定义负载均衡策略 熔断、降级 服务雪崩 服务降级 服务熔断 服务监控 为什么需要监控 服务监控的组件 skywalking 业务…

Linux基础I/O(三)——缓冲区和文件系统

文章目录 什么是C语言的缓冲区理解文件系统理解软硬链接 什么是C语言的缓冲区 C语言的缓冲区其实就是一部分内存 那么它的作用是什么&#xff1f; 下面有一个例子&#xff1a; 你在陕西&#xff0c;你远在山东的同学要过生日了&#xff0c;你打算送给他一份生日礼物。你有两种方…