用 redis bitmap 实现 12306 余票模型

本文Bilibili视频地址】 希望大家多多关注

火车票的售卖模式和正常的商品不同,其他商品的库存比较单一,而 12306 库存基于车次中的城市到城市。举个例子来说:

G1 车次从北京到上海虹桥,中间经过站有济南和南京南:

在售票时意味着可以购买以下几种组合

  1. 北京南--济南西
  1. 北京南--南京南
  1. 北京南--上海虹桥
  1. 济南西--南京南
  1. 济南西--上海虹桥
  1. 南京南--上海虹桥

而且相邻的方案,如果有公共的站,还会存在库存的依赖关系。比如:南京南--上海虹桥的票已经售完,那就意味着所有到上海虹桥的方案都是无票,但是我们可以买其他几个方案。

这种库存之间的耦合对于库存修改带来很多麻烦,如果采用简单的分散行程的方法来统计线路,那可能导致商品的数量很大,后续如果出现车次变更到达站或者其他变化,库存数据维护起来成本非常的高。

使用 redis bitmap 数据结构能够很好的解决这个问题,具体是如何实现:

为了简化场景,假设 G1 一个站最多只能卖 10 张票,对每一站维护一个余票数组,如下图:

当乘客想购买一张北京南--南京南的车票时,这时需要判断是否有足够的票来满足乘客,计算方式就是用 北京南,济南西,南京南三个数组进行与的操作:

根据库存结果,可以说明剩余的库存满足乘客的购票需求,假设乘客购买成功了 1 张票,座位号是 1,这个时候需要减少库存:

这个时候第二个乘客买了了一个北京南--上海虹桥的车票,结果就变成:

经过多次买票后,最终的位图为:

当库存变成上面的时候,如果我们想购买北京南--上海虹桥的车票时候,这个时候的库存数据为:

redis 指令

arduino 复制代码
//1. 初始化数据
setbit 北京南 0 0
setbit 北京南 1 0
setbit 北京南 2 0

setbit 济南西 0 0
setbit 济南西 1 0
setbit 济南西 2 0

setbit 南京南 0 0
setbit 南京南 1 0
setbit 南京南 2 0

setbit 上海虹桥 0 0
setbit 上海虹桥 1 0
setbit 上海虹桥 2 0

//2. 执行买票操作
setbit 北京南 0 1
setbit 济南西 0 1
setbit 南京南 0 1

//3. 执行与的操作
bitop or 北京南-南京南 北京南 济南西 南京南
1
相关推荐
古城小栈3 小时前
从 cargo-whero 库中,找到提升 rust 的契机
开发语言·后端·rust
keep one's resolveY4 小时前
SpringBoot实现重试机制的四种方案
java·spring boot·后端
阿丰资源6 小时前
基于Spring Boot的电影城管理系统(直接运行)
java·spring boot·后端
IT_陈寒6 小时前
SpringBoot自动配置的坑差点让我加班到天亮
前端·人工智能·后端
消失的旧时光-19437 小时前
Spring Boot 工程化进阶:统一返回 + 全局异常 + AOP 通用工具包
java·spring boot·后端·aop·自定义注解
追风筝的人er7 小时前
SpringBoot+Vue3 企业考勤如何处理法定假期?节假日方案、调休补班与工作日判断链路拆解
前端·vue.js·后端
金銀銅鐵8 小时前
[git] 如何丢弃对一个文件的改动?
git·后端
橘子海全栈攻城狮9 小时前
【最新源码】养老院系统管理A013
java·spring boot·后端·web安全·微信小程序
smallyoung9 小时前
具有反思能力的 Agentic RAG 实战:用 LangChain4j 实现 CRAG 纠错检索
人工智能·后端
EthanYuan9 小时前
💡RAG实践:从云知识库迁移到PostgreSQL ,并使用PGVector实现向量存储
后端