基于高并发场景下的电子票号快速取票方法及存储介质技术

技术编号:33033039 阅读:56 留言:0更新日期:2022-04-15 09:10
本发明专利技术涉及一种基于高并发场景下的电子票号快速取票方法及存储介质,所述方法包括以下步骤:从库存主体中拥有的票号段库存数据中取出部分票号段,保存到号段缓存表中;将取出的票号段拆分成独立的票号,并插入到Redis的待取号队列中;当收到开票指令后,从Redis的待取号队列中取出对应的票号,将获取的票号与开票指令中的标识ID进行绑定后返回该票号,同时从Redis的待取号队列中扣除该票号。通过基于关系型数据与Redis集群,满足不同的取号策略,保证取号快速稳定,以及有序出票。以及有序出票。以及有序出票。

【技术实现步骤摘要】
基于高并发场景下的电子票号快速取票方法及存储介质


[0001]本申请涉及电子票号
,具体涉及一种基于高并发场景下的电子票号快速取票方法及存储介质。

技术介绍

[0002]目前,在不同的业务领域中,均有使用有序的号码作为基本要素信息的凭证载体,例如非税收入票据、增值税专用发票、医院门诊住院发票、电影票等,在这些场景中,每个票据凭证的号码都具有顺序性、唯一性,不能重复使用的特点,同时,这些号码都要求被严格、规范地进行管理,不允许无故产生或丢失。随着网络技术的发展,网上出票业务量越来越大,如何在高并发的情况下,还能保证票号的快速、稳定、有序,是一个技术难题。
[0003]传统的解决方案,是在关系型数据库中维护一个库存信息表,该表中定义了票号的起始号、终止号以及对应的库存所属方(以下称为“库存主体”),当出票业务指令进入后端服务时,首先确定当前要扣减票号的库存主体是否有库存,再使用数据库行锁,对该库存主体下的所有库存数据进行加锁,防止其他并发的业务指令进行库存资源争夺,造成号码重复。锁定成功后,再将该票号所在号码段的起始号字段加1,代表扣除当前票号,然后保存主业务信息,最后释放行锁并提交数据库事务,继而出票成功。
[0004]然而现有的解决方案中,将全部库存数据存储于关系型数据库,受限于连接数及数据库自身的限制,在高并发请求下,数据库性能将急剧下降甚至出现异常,导致查询及更新库存失败。当同一库存主体对接多个外部开票系统时,由于业务中使用数据库行锁将这个库存主体的数据进行锁定,导致同一时刻,仅有一个出票指令获得行锁,进而请求A、B、C将按顺序以串行的方式对库存进行扣减,性能太低不满足生产要求。该方案仅满足号码从起始号到终止号(即由小到大)的方式进行出票,其他业务场景例如:指定号码扣号、指定数量扣号、先取号占用后再扣号等,由于是单纯用数据库来存储,因此在此方案上适配的局限性较大,涉及号码段数据行的查找、拆分、合并,会造成新的性能瓶颈。

技术实现思路

[0005]鉴于上述问题,本申请提供了一种基于高并发场景下的电子票号快速取票方法及存储介质,解决现有的票号系统中同一时刻,仅有一个出票指令获得行锁,出票速度慢的问题。
[0006]为实现上述目的,专利技术人提供了一种基于高并发场景下的电子票号快速取票方法,包括以下步骤:
[0007]从库存主体中拥有的票号段库存数据中取出部分票号段,保存到号段缓存表中;
[0008]将取出的票号段拆分成独立的票号,并插入到Redis的待取号队列中;
[0009]当收到开票指令后,从Redis的待取号队列中取出对应的票号,将获取的票号与开票指令中的标识ID进行绑定后返回该票号,同时从Redis的待取号队列中扣除该票号。
[0010]进一步优化,所述步骤“将获取的票号与开票指令中的标识ID进行绑定后返回该
票号”具体包括以下步骤:
[0011]将获取的票号与开票指令中的标识ID进行绑定后,将绑定标识ID的票号写入Redis的身份占用信息集中,并将score值为解锁时间戳;
[0012]从Redis的身份占用信息集中返回该票号。
[0013]进一步优化,所述步骤“当收到开票指令后,从Redis的待取号队列中取出对应的票号”具体包括以下步骤:
[0014]当收到开票指令后,从Redis的身份占用信息集中确认是否有开票指令中的标识ID占用的票据号,若有,则从Redis的身份占用信息集中返回该票号;
[0015]若没有,则从Redis的待取号队列中取出对应的票号。
[0016]进一步优化,还包括以下步骤:
[0017]查询Redis的身份占用信息集中是否存在解锁时间戳超过当前时间戳的票号;
[0018]若存在,更新该票号的号码信息为未使用,
[0019]在Redis的身份占用信息集中移除该票号和其绑定的标识ID的信息;
[0020]将该票号插入到Redis的优先取号队列中。
[0021]进一步优化,所述步骤“当收到开票指令后,从Redis的待取号队列中取出对应的票号”具体包括以下步骤:
[0022]当收到开票指令后,从Redis的身份占用信息集中确认是否有开票指令中的标识ID占用的票据号,若有,则从Redis的身份占用信息集中返回该票号;
[0023]若没有,则判断Redis的优先取号队列是否有对应的票号;
[0024]若有号,则从Redis的优先取号队列中取出对应的票号,并返回取出的票号;
[0025]若没有,则从Redis的待取号队列中取出对应的票号。
[0026]进一步优化,所述步骤“从Redis的待取号队列中取出对应的票号”之前包括自动入库步骤:
[0027]判断Redis的待取号队列中是否有票号;
[0028]若有,则从Redis的待取号队列中取出对应的票号;
[0029]若没有,则判断库存主体中是否有票号;
[0030]若有,则从库存主体中扣除预设数量的票号段;
[0031]并将扣除的预设数量的票号段拆散插入到Redis的待取号队列中。
[0032]进一步优化,所述步骤“从Redis的待取号队列中取出对应的票号”具体包括以下步骤:
[0033]从Redis的待取号队列中取出号码最小的票号或者与开票信息中标识ID占用的票号或者预设数量的票号。
[0034]进一步优化,还包括以下步骤:
[0035]当有新的票号段存入库存主体时,判断当前库存主体中是否存在与存入的票号段中重复的号码;
[0036]若有,则提示入库失败;
[0037]若没有,则判断在Redis的待取号列队、优先取号列队及身份占用信息集中是否存在重复的号码;
[0038]若有,则提示入库失败;
[0039]若没有,则将新的票号段插入到库存主体中。
[0040]进一步优化,还包括以下步骤:
[0041]查询所有曾经进入号段缓存表中的票号;
[0042]按照库存主体将所有曾经进入号段缓存表中的票号进行分组;
[0043]遍历每个分组中的每个票号,调用票号业务服务接口查询每个票号所对应的业务数据;
[0044]若存在业务数据,则对该票号不进行处理;
[0045]若不存在业务数据,则将该票号插入到Redis的优先取号列队中。
[0046]还提供了另一个技术方案:一种存储介质,所述存储介质存储有计算机程序,所述计算机程序被处理器运行时执行上述所述方法的步骤。
[0047]区别于现有技术,上述技术方案,通过将库存主体中拥有的票号段库存数据取出部分票号段放入票号池中作为热数据,即短时间内即将被使用的票号数据,保存到号段缓存表中,然后将取出的票号段拆分成独立的票号,并插入到Redis的待取号队列中,当开票指令进入后端系统时,即收到开票指令后,其中,开票指令中携带一个能判定该指令身份的唯一标识ID,从Redis的待取号队列本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于高并发场景下的电子票号快速取票方法,其特征在于,包括以下步骤:从库存主体中拥有的票号段库存数据中取出部分票号段,保存到号段缓存表中;将取出的票号段拆分成独立的票号,并插入到Redis的待取号队列中;当收到开票指令后,从Redis的待取号队列中取出对应的票号,将获取的票号与开票指令中的标识ID进行绑定后返回该票号,同时从Redis的待取号队列中扣除该票号。2.根据权利要求1所述的基于高并发场景下的电子票号快速取票方法,其特征在于,所述步骤“将获取的票号与开票指令中的标识ID进行绑定后返回该票号”具体包括以下步骤:将获取的票号与开票指令中的标识ID进行绑定后,将绑定标识ID的票号写入Redis的身份占用信息集中,并将score值为解锁时间戳;从Redis的身份占用信息集中返回该票号。3.根据权利要求2所述的基于高并发场景下的电子票号快速取票方法,其特征在于,所述步骤“当收到开票指令后,从Redis的待取号队列中取出对应的票号”具体包括以下步骤:当收到开票指令后,从Redis的身份占用信息集中确认是否有开票指令中的标识ID占用的票据号,若有,则从Redis的身份占用信息集中返回该票号;若没有,则从Redis的待取号队列中取出对应的票号。4.根据权利要求2所述的基于高并发场景下的电子票号快速取票方法,其特征在于,还包括以下步骤:查询Redis的身份占用信息集中是否存在解锁时间戳超过当前时间戳的票号;若存在,更新该票号的号码信息为未使用,在Redis的身份占用信息集中移除该票号和其绑定的标识ID的信息;将该票号插入到Redis的优先取号队列中。5.根据权利要求4所述的基于高并发场景下的电子票号快速取票方法,其特征在于,所述步骤“当收到开票指令后,从Redis的待取号队列中取出对应的票号”具体包括以下步骤:当收到开票指令后,从Redis的身份占用信息集中确认是否有开票指令中的标识ID占用的票据号,若有,则从Redis的身份占用信息集中返回该票号;若没有,则判断Redis的优先取...

【专利技术属性】
技术研发人员:郑为伟张文肖勇李德福黄荣明俞兆坚武宜婧
申请(专利权)人:福建博思软件股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1