Redis与Kafka达成高并发更新库存与数据一致性保证

铁路余票系统设计:高并发下的强一致性与分片锁优化 余票查询是典型高并发、强一致性、时空动态的分布式库存场景,其本质是‘读多写频+状态强校验’的复合型数据服务。不同于电商秒杀或普通缓存库存,铁路余票需同时满足毫秒级响应、座位级精确扣减、15天预售期多维切片等硬性约束。技术实现上,必须突破传统缓存预热与单表锁的局限,转向布隆过滤拦截、四维逻辑分片、五元组行级锁、核心事务瘦身等组合策略。本文聚焦真实春运级压力下的余票库落地实践,涵盖MySQL深度调优、Redis三级缓存协同、分库分表平滑扩容及渠道调度解耦等关键路径,为高确定性分布式库存系统提供可复用的工程范式。 阅读详情

一. 并发更新方案

采用在Redis中判断并更新库存(库存值可增可减),由Redis保证库存的正确性,由Kafka与MongodDB数据库事务保证最终的一致性。

二. Redis使用lua脚本来保证并发更新的正确性

1. Redis会将整个lua脚本作为一个整体执行,中间不会被其它命令插入,保证了原子性,线程安全,且不需要事务控制。

2. Redis中的值,假设正确范围在0 <= x <= max(通过脚本传参)

3. 脚本的作用是,检测key指定的值与increment之和counter是否在正确范围内;如果在正确范围内则更新为counter,更新成功返回1,更新失败返回0;如果不在正确范围内则返回0。

4. Redis执行脚本成功,不论后续发送消息成功如否,都要给业务调用方返回成功。如果执行脚本失败,直接给业务调用方返回失败,无后续动作。

三. Kafka配置与消息主要内容

生产者采用异步发送加回调的方式,若发送失败或出现异常,则必须在回调函数里保证消息一定要发送成功。

生产者的acks设置为all,保证不丢消息。

消息内容:{

key:long类型,kafka消息key,雪花算法唯一ID,

orderId:long类型,订单ID,雪花算法唯一ID,

skuId:long类型,库存商品ID,雪花算法唯一ID,

increment:int类型,增加或减少库存,

timestamp:long类型,时间戳

}

消费者配置手动提交ACK,消费消息的接口逻辑如下:

接口开启MongoDB事务(REQUIRED_NEW,rollbackFor=Exception.class)

1)插入防重表,MongoDB的集合id设置为消息的key或orderId都可以,保证唯一就行。

2)更新库存表,使用MongoDB的inc指令对库存值做原子操作。

3)返回更新结果。

因为MongoDB中的WriteConflict问题,上述接口需要重试直到保证MongoDB更新成功。消费接口调用成功后才能ACK。

重复消费的问题:

事务中需要插入防重表,重复的消息key会插入失败,MongoDB事务会回滚,保证了数据库中库存值的正确性。

四. 并发更新与补偿逻辑验证

假设库存值的正确范围在0至1000,即0 <= x <= 1000

时序

线程A+1

线程B-1

Redis值

DB值

备注

999

999

执行lua脚本+1

1000

999

发送+1消息成功

执行lua脚本-1

999

1000

发送-1消息成功

999

999

最终一致

时序

线程A+1

深入浅出:我如何用 Redis + Kafka 实现高可用“最终一致性”系统架构(实战+思考) 🏆本文收录于《滚雪球学Spring Boot》,专门攻坚指数提升,2025 年国内最系统+最强(更新中)。    本专栏致力打造最硬核 Spring Boot 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。 阅读详情

相关推荐

matlab tolx,Nelder-Mead算法matlab

Nelder-Mead算法适合变量数不是很多的方程求极值.原理:Nelder-Mead法是利用多面体来逐步逼近最佳点x*.设函数变量为n维,则在n维空间里多面体有(n+1)个顶点.设x1,x2,...,xn+1为多面体的顶点,且满足:f(x1)<=f(x2)<=...<=f(xn+1)Nelder-Mead法试着将多面体中最差的顶点xn+1(也就是函数的最大点)以新的最佳点替代,...

weixin_36485298的博客 1480

阿里平头哥与华为芯片的比较

阿里平头哥与华为芯片代表了中国AI芯片领域的两种典型发展路径:平头哥通过兼容CUDA生态快速切入市场,以较低成本提供接近国际水平的AI算力;华为则坚持全栈自研路线,构建从芯片到框架的完整技术体系,更注重供应链安全和自主可控。从短期来看,平头哥PPU在单卡性能参数上全面超越昇腾910B,接近英伟达H20水平,且成本优势明显,有望在云服务和互联网应用领域取得更大市场份额。而华为昇腾则凭借全栈自研和端边云协同优势,在政企市场和科研领域更具竞争力。

shao.bing的专栏 3976

C#集成Bartender:动态图片标签打印的实战与优化

本文详细介绍了在C#程序中集成Bartender实现动态图片标签打印的实战方法与优化策略。通过具名数据源绑定、图片对象尺寸控制等核心技巧,解决了动态图片显示/隐藏的难题,并提供了从模板设计、代码架构到性能优化、错误处理的全流程指南,帮助开发者构建稳定高效的工业级标签打印系统。

weixin_29216957的博客 431

量化策略开发步骤系列(5)前向测试和统计意义

我们在第 4 部分,展示了我们策略的样本外测试并讨论了其结果。用于开发模型的数据是 2018 年至 2021 年的数据,测试数据是 2021 年至 2022 年的数据。但有一种方法可以更好地利用我们的数据。

码上助君的专栏 1843

逆向Shopee签名机制:从参数分析到稳定采集方案

本文深入解析了Shopee签名机制的逆向过程,从参数分析到稳定采集方案的实现。通过抓包定位关键参数`sap-ri`和`x-sap-sec`,还原了签名生成算法,并提供了Python实现代码。文章还分享了反反爬策略、性能优化技巧及长期维护建议,帮助开发者构建稳定的Shopee数据采集方案。

weixin_27722377的博客 672

Python实战:5分钟搞定N-CMAPSS航空发动机数据集解析(附完整代码)

本文提供了一份针对N-CMAPSS航空发动机数据集的快速解析实战指南。通过Python的h5py库,详细演示了如何读取HDF5文件结构、理解数据分类(如传感器、健康参数、场景描述符)并加载为Pandas DataFrame。文章还澄清了数据集中常见的变量数量疑惑,并给出了从数据加载到构建剩余使用寿命预测模型预处理流水线的完整代码,帮助工程师和研究人员高效入门航空发动机预测性维护分析。

weixin_29057065的博客 422

手把手教你学Simulink--基于飞行控制与稳定性的场景实例:固定翼无人机的自动起飞与降落控制

本文介绍了使用Simulink对固定翼无人机自动起飞与降落控制系统进行建模与仿真的完整流程。首先构建了包含飞行器动力学模型、控制系统、环境模拟等模块的系统结构,详细阐述了简化动力学方程的推导和实现。重点讲解了PID控制器设计,包括起飞阶段的速度控制和降落阶段的高度控制策略。通过添加环境干扰和输入信号,建立了完整的仿真模型,并利用输出显示模块评估系统性能。该实例为无人机自主控制系统的开发提供了有效的仿真验证方法,有助于优化参数提高飞行稳定性。

MHD0815的博客 4308

【WRF模拟】保存wrf输出文件到指定目录+仅输出指定空间域/变量文件

修改wrf命令以更改指定输出文件目录等

WW、forever的博客 543

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: VirtualBox中用CentOS7安装k8s v1.23.4集群
下一篇: golang 设置可用的proxy和环境变量
greatsharp
博客等级 码龄21年 1粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值