CN115729978A - 流水号生成方法、装置、计算机设备和存储介质 - Google Patents
流水号生成方法、装置、计算机设备和存储介质 Download PDFInfo
- Publication number
- CN115729978A CN115729978A CN202211480046.9A CN202211480046A CN115729978A CN 115729978 A CN115729978 A CN 115729978A CN 202211480046 A CN202211480046 A CN 202211480046A CN 115729978 A CN115729978 A CN 115729978A
- Authority
- CN
- China
- Prior art keywords
- serial number
- last
- time period
- current
- redis
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 49
- 238000004590 computer program Methods 0.000 claims abstract description 40
- 230000002159 abnormal effect Effects 0.000 claims description 7
- 230000008569 process Effects 0.000 abstract description 11
- 238000002955 isolation Methods 0.000 abstract description 3
- 238000010586 diagram Methods 0.000 description 5
- 238000005516 engineering process Methods 0.000 description 4
- 230000005856 abnormality Effects 0.000 description 2
- 238000013500 data storage Methods 0.000 description 2
- 238000005538 encapsulation Methods 0.000 description 2
- 239000000284 extract Substances 0.000 description 2
- 238000007726 management method Methods 0.000 description 2
- OKTJSMMVPCPJKN-UHFFFAOYSA-N Carbon Chemical compound [C] OKTJSMMVPCPJKN-UHFFFAOYSA-N 0.000 description 1
- 241000533950 Leucojum Species 0.000 description 1
- 238000004458 analytical method Methods 0.000 description 1
- 238000004422 calculation algorithm Methods 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 229910021389 graphene Inorganic materials 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请涉及一种流水号生成方法、装置、计算机设备、存储介质和计算机程序产品。所述方法包括:获取流水号生成请求;根据流水号生成请求,确定流水号键;调用基于原子操作封装的流水号事务线程查询redis系统,生成当前流水号;其中,流水号事务线程用于查询redis系统中与流水号键对应的上次流水号,根据上次流水号以及redis系统当前时间,生成当前流水号;上次流水号为redis系统当前时间之前最后一次生成的流水号。整个方案将根据redis系统当前时间以及redis系统中上次流水号来生成当前流水号封装为一个事务,基于原子操作保证当前流水号生成过程的原子性、一致性、隔离性以及持久性,可以在不同的业务系统中保证流水号唯一,提高了生成的流水号的准确性。
Description
技术领域
本申请涉及数据处理技术领域,特别是涉及一种流水号生成方法、装置、计算机设备、存储介质和计算机程序产品。
背景技术
随着大数据技术的发展,各行各业的数据量剧增,出现了各种业务管理系统,给每一条数据一个唯一数据标识,当需要查询该数据时看通过数据标识获取该数据,即给每条数据一个特定的流水号,以对海量数据进行管理。
目前,主要基于关系型数据库来生成流水号,通过获取上次流水号,基于上次流水号直接自增得到当前流水号。但是在高并发情况下,基于数据库生成的流水号可能会不唯一,导致基于目前的流水号生成方法生成的流水号不准确。
发明内容
基于此,有必要针对上述技术问题,提供一种准确的流水号生成方法、装置、计算机设备、计算机可读存储介质和计算机程序产品。
第一方面,本申请提供了一种流水号生成方法。该方法包括:
获取流水号生成请求;
根据流水号生成请求,确定流水号键;
调用基于原子操作封装的流水号事务线程查询redis系统,生成当前流水号;
其中,流水号事务线程用于查询redis系统中与流水号键对应的上次流水号,根据上次流水号以及redis系统当前时间,生成当前流水号;上次流水号为redis系统当前时间之前最后一次生成的流水号。
在其中一个实施例中,还包括:当在redis系统中未查询到与流水号键对应的上次流水号时,生成初始化流水号;将初始化流水号设置为上次流水号。
在其中一个实施例中,当在redis系统中未查询到与流水号键对应的上次流水号时,生成初始化流水号包括:当在redis系统中未查询到与流水号键对应的上次流水号时,获取redis系统当前时间;根据redis系统当前时间,确定流水号时间周期;根据流水号时间周期,生成初始化流水号。
在其中一个实施例中,根据上次流水号以及redis系统当前时间,生成当前流水号包括:根据上次流水号,确定上一时间周期;根据redis系统当前时间,确定当前时间周期;判断上一时间周期和当前时间周期的大小关系,得到时间周期判断结果;基于时间周期判断结果,生成当前流水号。
在其中一个实施例中,基于时间周期判断结果,生成当前流水号包括:当上一时间周期与当前时间周期相同时,对上次流水号进行自增,生成当前流水号。
在其中一个实施例中,基于时间周期判断结果,生成当前流水号包括:当当前时间周期大于上一时间周期时,根据当前时间周期,生成当前流水号。
在其中一个实施例中,基于时间周期判断结果,生成当前流水号包括:当当前时间周期小于上一时间周期时,推送异常提示消息。
第二方面,本申请还提供了一种流水号生成装置。该装置包括:
获取模块,用于获取流水号生成请求;
确定模块,用于根据流水号生成请求,确定流水号键;
生成模块,用于调用基于原子操作封装的流水号事务线程查询redis系统,生成当前流水号;
其中,流水号事务线程用于查询redis系统中与流水号键对应的上次流水号,根据上次流水号以及redis系统当前时间,生成当前流水号;上次流水号为redis系统当前时间之前最后一次生成的流水号。
第三方面,本申请还提供了一种计算机设备。该计算机设备包括存储器和处理器,该存储器存储有计算机程序,该处理器执行该计算机程序时实现以下步骤:
获取流水号生成请求;
根据流水号生成请求,确定流水号键;
调用基于原子操作封装的流水号事务线程查询redis系统,生成当前流水号;
其中,流水号事务线程用于查询redis系统中与流水号键对应的上次流水号,根据上次流水号以及redis系统当前时间,生成当前流水号;上次流水号为redis系统当前时间之前最后一次生成的流水号。
第四方面,本申请还提供了一种计算机可读存储介质。该计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以下步骤:
获取流水号生成请求;
根据流水号生成请求,确定流水号键;
调用基于原子操作封装的流水号事务线程查询redis系统,生成当前流水号;
其中,流水号事务线程用于查询redis系统中与流水号键对应的上次流水号,根据上次流水号以及redis系统当前时间,生成当前流水号;上次流水号为redis系统当前时间之前最后一次生成的流水号。
第五方面,本申请还提供了一种计算机程序产品。该计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现以下步骤:
获取流水号生成请求;
根据流水号生成请求,确定流水号键;
调用基于原子操作封装的流水号事务线程查询redis系统,生成当前流水号;
其中,流水号事务线程用于查询redis系统中与流水号键对应的上次流水号,根据上次流水号以及redis系统当前时间,生成当前流水号;上次流水号为redis系统当前时间之前最后一次生成的流水号。
上述流水号生成方法、装置、计算机设备、存储介质和计算机程序产品,获取流水号生成请求;根据流水号生成请求,确定流水号键;调用基于原子操作封装的流水号事务线程查询redis系统,生成当前流水号;其中,流水号事务线程用于查询redis系统中与流水号键对应的上次流水号,根据上次流水号以及redis系统当前时间,生成当前流水号。整个方案将根据redis系统当前时间以及redis系统中上次流水号来生成当前流水号封装为一个事务,基于原子操作保证当前流水号生成过程的原子性、一致性、隔离性以及持久性,可以在不同的业务系统中保证流水号唯一,提高了生成的流水号的准确性。
附图说明
为了更清楚地说明本申请实施例或传统技术中的技术方案,下面将对实施例或传统技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为一个实施例中流水号生成方法的应用环境图;
图2为一个实施例中流水号生成方法的流程示意图;
图3为一个实施例中初始化流水号生成步骤的流程示意图;
图4为另一个实施例中流水号生成方法的流程示意图;
图5为一个实施例中流水号生成装置的结构框图;
图6为一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
本申请实施例提供的流水号生成方法,可以应用于如图1所示的应用环境中。其中,终端102通过网络与服务器104进行通信。数据存储系统可以存储服务器104需要处理的数据。数据存储系统可以集成在服务器104上,也可以放在云上或其他网络服务器上。终端102响应业务操作,生成流水号生成请求,并将流水号生成请求发送至服务器104,然后,服务器104获取流水号生成请求;根据流水号生成请求,确定流水号键;调用基于原子操作封装的流水号事务线程查询redis系统,生成当前流水号;其中,流水号事务线程用于查询redis系统中与流水号键对应的上次流水号,根据上次流水号以及redis系统当前时间,生成当前流水号;上次流水号为与redis系统当前时间相邻的redis系统历史时间生成的流水号。其中,终端102可以但不限于是各种个人计算机、笔记本电脑、智能手机、平板电脑、物联网设备和便携式可穿戴设备,物联网设备可为智能音箱、智能电视、智能空调、智能车载设备等。便携式可穿戴设备可为智能手表、智能手环、头戴设备等。服务器104可以用独立的服务器或者是多个服务器组成的服务器集群来实现。
在一个实施例中,如图2所示,提供了一种流水号生成方法,以该方法应用于图1中的服务器104为例进行说明,包括以下步骤:
步骤202,获取流水号生成请求。
其中,流水号表示业务系统中一条数据或者一条信息的唯一ID,流水号可以是客户标识,也可以是订单标识,还可以是订单流水标识,还可以是标识其他信息的ID,本实施例在此不作限定。这里的业务系统可以是客户管理系统,也可以是购物系统,还可以是订单系统等。终端侦听并响应用户在业务系统的业务操作,生成流水号生成请求,并将流水号生成请求发送至服务器,本申请中的服务器为redis服务器,流水号生成请求中携带业务标识,流水号生成请求还可以直接携带流水号键。业务标识用于表征业务身份的唯一标识,不同业务的业务标识不同。下面。举例说明本申请的流水号生成请求生成过程,例如,当用户在业务系统进行注册时,终端生成并发送用户流水号生成请求至服务器,用户流水号生成请求中携带用户授权的用户标识以及用户注册业务标识,以使服务器根据用户标识以及用户注册业务标识来生成用户流水号,用户流水号表征用户身份的唯一标识。再如,当用户在订单系统下单时,终端响应用户的下单操作生成订单流水号生成请求,将订单流水号生成请求发送至服务器,以生成订单流水号,订单流水号用于表征该订单的唯一标识。
具体地,本申请中的服务器为redis服务器,redis服务器获取终端发送的流水号生成请求。流水号具备唯一性,通常用来作为数据库主键,流水号还具备单调递增性,流水号的大小跟生成顺序保持一致,方便比较两笔流水的时间先后性,也便于使用keyset分页,比起offset分页有更好的查询效率,流水号还包含生成时间信息,可以直接从流水号看出流水是在哪一个时间周期内生成的,便于追踪和排查问题。
步骤204,根据流水号生成请求,确定流水号键。
其中,流水号键是生成流水号所需的key,也用于标识流水号在数据库中的查询关键词。例如订单流水号的流水号键可以为order_no,后续redis查询订单信息时直接根据orderno进行查询,当得知具体订单流水号时直接根据流水号键以及该订单流水号查询到该订单的详细信息。
在本申请的一个可选实施例中,流水号生成请求中携带业务标识。redis服务器获取终端发送的流水号生成请求,对流水号生成请求进行解析,得到业务标识;根据所述业务标识,从本地储存的业务标识与流水号键的对应关系中进行查询,得到业务标识对应的流水号键。
在本申请的另一个可选实施例中,流水号生成请求中携带流水号键。redis服务器获取终端发送的流水号生成请求,对流水号生成请求进行解析,得到流水号键。
步骤206,调用基于原子操作封装的流水号事务线程查询redis系统,生成当前流水号。
其中,流水号事务线程用于查询redis系统中与流水号键对应的上次流水号,根据上次流水号以及redis系统当前时间,生成当前流水号。上次流水号为redis系统当前时间之前最后一次生成的流水号。
上次流水号指的是当前时刻之前该业务数据库中最后生成的流水号,由于流水号具有自增性,因此为历史缓存中最大流水号。例如,redis系统当前时间为20220919,redis系统中存储的历史最大订单流水号为202209190001,则上次流水号为202209190001。再比如,redis系统当前时间为20220920,redis系统当前时间之前最后一次生成的流水号为202209200999,则上次流水号为202209200999,202209200999也为历史最大流水号。
流水号包括时间周期以及自增序列号,时间周期指的流水号的生成周期,如时间周期可以为一年、一个月、一天、一个小时、一分钟、一秒或者一毫秒等。自增序列号在根据序列号位数小于自增序列号长度时,左侧自动补零。时间周期可以根据业务数据量来确定,当业务数据量较大时,如订单系统中的时间周期可以设置为一毫秒,在一毫秒内可能会产生多个订单,生成多个流水号。例如,当流水号的时间周期为年(yyyy),流水号长度为10,则自增序列号长度为6,2022年到2023年之间的流水号序列可以包括2022000001、2022000002、2022000003、2023000001、2023000002、2023000003。再如,流水号的时间周期为月(yyyyMM),流水号长度为12,则自增序列号长度为6,2022年09月到2022年10月之间的流水号序列可以包括202209000001、202209000002、202209000003、202210000001、202210000002、202210000003。又如,流水号的时间周期为天(yyyyMMdd),流水号长度为12,则自增序列号长度为4,2022年09月19日到2022年09月20日之间的流水号序列可以包括202209190001、202209190002、202209190003、202209200001、202209200002、202209200003。
原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会切换到另一个线程。即redis服务器查询redis系统中与流水号键对应的上次流水号,根据上次流水号以及redis系统当前时间,生成当前流水号的过程是一个整体,不会被其他线程打断。事务块内的多条命令会按照先后顺序被放进一个队列当中,本实施例中获取上次流水号和redis系统当前时间的先后顺序库互换,因此可以先获取上次流水号再获取redis系统当前时间,也可以先获取redis系统当前时间再获取上次流水号。但是根据上次流水号以及redis系统当前时间,生成当前流水号为原子操作中的最后一个步骤。
具体地,redis服务器调用基于原子操作封装的流水号事务线程,在流水号事务线程内部,redis服务器首先获取事务启动命令,执行事务启动命令,然后,redis服务器接收流水号自增命令以及流水号键,根据流水号键进行流水号查询,得到上次流水号,根据流水号自增命令以及流水号键组成流水号自增命令,然后输入redis系统当前时间查询命令,将自增命令以及redis系统当前时间查询指令组成原子操作,自增命令会基于上次流水号和redis系统当前时间来生成当前流水号之后,执行该原子操作,得到当前流水号。
进一步地,流水号事务线程的事务启动命令为MULTI,当流水号键为order_no,自增命令为INCR,则流水号自增命令为INCR order_no,redis系统当前时间查询指令为TIME,执行原子操作命令为EXEC。例如,在redis系统内部,流水号事务线程的执行过程如下:
redis>MULTI
OK
redis>INCR order_no
QUEUED
redis>TIME
QUEUED
redis>EXEC
上述流水号生成方法中,获取流水号生成请求;根据流水号生成请求,确定流水号键;调用基于原子操作封装的流水号事务线程查询redis系统,生成当前流水号;其中,流水号事务线程用于查询redis系统中与流水号键对应的上次流水号,根据上次流水号以及redis系统当前时间,生成当前流水号。整个方案将根据redis系统当前时间以及redis系统中上次流水号来生成当前流水号封装为一个事务,基于原子操作保证当前流水号生成过程的原子性、一致性、隔离性以及持久性,可以在不同的业务系统中保证流水号唯一,提高了生成的流水号的准确性。
在其中一个实施例中,还包括:当在redis系统中未查询到与流水号键对应的上次流水号时,生成初始化流水号;将初始化流水号设置为上次流水号。
具体地,redis服务器在生成当前流水号之前,首先会获取与流水号键对应的上次流水号,当在redis系统中未查询到与流水号键对应的上次流水号时,表明redis系统中从未根据该流水号键来生成流水号,因此,首先需要生成初始化流水号,然后根据初始化流水号,然后将初始化流水号设置为上次流水号,再基于上次流水号以及redis系统当前时间来生成当前流水号。
进一步地,获取与流水号键对应的上次流水号的查询命令,即上次流水号查询命令包括查询命令以及流水号键,如查询命令为EXISTS,流水号键为order_no,上次流水号查询命令为EXISTS order_no。当返回1表明在redis系统中查询到与流水号键对应的上次流水号。当返回0表明在redis系统中未查询到与流水号键对应的上次流水号,则获取redis系统当前时间,基于redis系统当前时间生成初始化流水号。
本实施例中,可以在不存在与流水号键对应的上次流水号时对流水号进行初始化,将初始化流水号设置为上次流水号,减少直接根据上次流水号以及redis系统当前时间生成当前流水号引起的故障,提高了流水号生成过程的故障率。
在其中一个实施例中,如图3所示,当在redis系统中未查询到与流水号键对应的上次流水号时,生成初始化流水号包括:
步骤302,当在redis系统中未查询到与流水号键对应的上次流水号时,获取redis系统当前时间。
具体地,当在redis系统中未查询到与流水号键对应的上次流水号时,根据redis系统当前时间查询指令TIME查询redis系统当前时间,接收返回的时间结果。
步骤304,根据redis系统当前时间,确定流水号时间周期。
具体地,将redis系统返回的时间结果转换为ISO时间格式,并根据yyyyMMdd格式将ISO时间再进行转化,根据yyyyMMdd格式的redis系统当前时间提取时间周期,获取时间周期类型,时间周期类型包括年、月、日、小时、分钟、秒以及毫秒。然后根据时间周期类型确定时间周期长度,根据时间周期长度提取时间周期。当时间周期为日(天)时,则yyyyMMdd格式的redis系统当前时间即为流水号时间周期。
步骤306,根据流水号时间周期,生成初始化流水号。
具体地,redis服务器获取自增序列号长度,根据自增序列号长度生成全为0的序列号,流水号时间周期与长度为自增序列号长度的全为0的序列号拼接形成初始化流水号,将初始化流水号设置为上次流水号,再基于上次流水号以及redis系统当前时间来生成当前流水号。
进一步地,生成初始化流水号的过程如下:
redis>EXISTS order_no
(integer)0
返回值是0,表明在redis系统中未查询到与流水号键对应的上次流水号,则需要设置一个初始化流水号给后续的INCR命令使用。
货取redis服务器的系统时间,执行TIME命令
redis>TIME
1)"1663557913","792785"
"1663557913","792785"为时间结果,将时间结果转化成ISO时间是2022-09-19T11:25:13.792785,根据yyyyMMdd格式化得到20220919,若时间周期为日,即时间周期长度是8,自增序号长度为4,因此生成的初始化流水号为202209190000。
需调用设置命令SETNX而不是SET来设置初始化流水号,防止竞态条件下强制覆盖已开始自增后的值,导致流水号重新开始出现重复流水号的问题。
redis>SETNX order_no 202209190000
(integer)1
返回值可以忽略,无论是1还是0都可以保证已经初始化过了。
本实施例中,基于redis系统当前时间来生成初始化流水号,并基于设置命令SETNX将初始化流水号设置为上次流水号,保证初始化流水号唯一,进而提高当前流水号生成的准确性。
在其中一个实施例中,根据上次流水号以及redis系统当前时间,生成当前流水号包括:根据上次流水号,确定上一时间周期;根据redis系统当前时间,确定当前时间周期;判断上一时间周期和当前时间周期的大小关系,得到时间周期判断结果;基于时间周期判断结果,生成当前流水号。
具体地,redis服务器获取时间周期类型,根据时间周期类型确定流水号中时间周期长度,然后从上次流水号中按照时间周期长度从前提取时间周期,得到上一时间周期。之后,redis系统当前时间查询指令TIME查询redis系统当前时间,接收返回的时间结果,redis系统返回的时间结果转换为ISO时间格式,并根据yyyyMMdd格式将ISO时间再进行转化,根据yyyyMMdd格式的redis系统当前时间以及时间周期长度从前提取时间周期,得到当前时间周期。最后,判断上一时间周期和当前时间周期的大小关系,得到时间周期判断结果,再基于时间周期判断结果来生成当前流水号。
在本申请的一个可选实施例中,redis服务器先根据上次流水号进行自增,然后从自增结果中按照时间周期长度从前提取时间周期,得到上一时间周期,根据redis系统当前时间,确定当前时间周期;判断上一时间周期和当前时间周期的大小关系,得到时间周期判断结果;基于时间周期判断结果,生成当前流水号。
本实施例中,通过判断上次流水号和redis系统当前时间中时间周期的大小关系,可以得到准确的当前时间周期,并基于准确的当前时间周期,来生成当前流水号。
在其中一个实施例中,基于时间周期判断结果,生成当前流水号包括:当上一时间周期与当前时间周期相同时,对上次流水号进行自增,生成当前流水号。
具体地,当redis服务器判断的时间周期判断结果为上一时间周期与当前时间周期相同时,则当前流水号的时间周期与上一时间周期或者当前时间周期还在同一时间周期内,则对上次流水号进行自增,生成当前流水号。
例如:执行redis>EXEC命令后,得到的返回结果为:
1)(integer)202209190001
2)"1663571735","404243"
自增结果是202209190001,redis系统当前时间是2022-09-19T15:15:35.404243,根据yyyyMMdd格式化得到20220919,等于自增结果里面的20220919,还是保持在同一个时间周期内,因此直接返回自增结果202209190001作为当前流水号。
在其中一个实施例中,基于时间周期判断结果,生成当前流水号包括:当当前时间周期大于上一时间周期时,根据当前时间周期,生成当前流水号。
具体地,当redis服务器判断的时间周期判断结果为当前时间周期大于上一时间周期时,则当前流水号的时间周期已经跳出上次流水号所在的上一时间周期,则根据当前时间周期以及基于redis的lua脚本实现CAS操作命令,生成当前流水号。
例如:执行redis>EXEC命令后,得到的返回结果为:
1)(integer)202209190002
2)"1663631717","305246"
自增结果是202209190002,redis系统当前时间是2022-09-20T07:55:17.305246,根据yyyyMMdd格式化得到20220920,大于自增结果里面的20220919,已经向前跳跃到了新的时间周期,需要在新的时间周期内重新开始流水号202209200001。
为了防止竞态条件下强制覆盖数据导致流水号重复的问题,不能直接调用SET命令来修改值,需要用redis的lua脚本实现CAS操作来保证操作的并发安全性。
redis>EVAL"if redis.call('get',KEYS[1])==ARGV[1]then redis.call('set',KEYS[1],ARGV[2])return 1else return 0end"1order_no202209190002202209200001
(integer)1
返回值是1说明重新开始流水号成功,返回重新开始的流水号202209200001。
返回值是0说明已被别的地方重新开始流水号了,重新尝试获取流水号返回。
本实施例中,可以在当前时间周期与上次流水号时间周期不同时,根据当前时间周期以及基于redis的lua脚本实现CAS操作命令,生成当前流水号,保证当前流水号唯一。
在其中一个实施例中,基于时间周期判断结果,生成当前流水号包括:当当前时间周期小于上一时间周期时,推送异常提示消息。
具体地,当redis服务器判断的时间周期判断结果为当前时间周期小于上一时间周期时,则当前流水号的时间周期小于上次流水号所在的上一时间周期,表明出现异常,则推送异常提示消息或者直接基于上一时间周期,根据上次流水号自增得到当前流水号。
例如:执行redis>EXEC命令后,得到的返回结果为:
1)(integer)202209200000
2)"1663571735","404243"
自增结果是202209200000,redis系统当前时间是2022-09-19T15:15:35.404243,根据yyyyMMdd格式化得到20220919,小于自增结果里面的20220920,假设redis服务器的系统时间正常,说明自增序列号溢出了,根据业务场景有两种策略可选:
(1)返回自增结果当流水号,缺点是从流水号上看时间周期跟真实的生成时间所在的周期不一致,但唯一性和单调递增性不会被打破。
(2)抛出溢出异常报错,缺点是本周期内的剩余时间都不能提供服务,需要等时间流逝到下一个时间周期才恢复服务。
在实际应用中需要根据业务情况合理设置流水号的长度预留充足的自增空间来避免这种情况发生,在redis系统中,流水号支持的最大长度为19。
本实施例中,给出了在redis系统当前时间小于上次流水号的时间周期时的两种解决方式,都可以保证流水号的唯一,提高流水号生成的准确性,降低流水号生成过程的故障率。
为了易于理解本申请实施例提供的技术方案,如图4所示,以完整的流水号生成过程对本申请实施例提供的流水号生成方法进行简要说明:
(1)获取流水号生成请求。
(2)根据流水号生成请求,确定流水号键。
(3)调用基于原子操作封装的流水号事务线程,查询redis系统是否存在与流水号键对应的上次流水号。
(4)当在redis系统中未查询到与流水号键对应的上次流水号时,获取redis系统当前时间;根据redis系统当前时间,确定流水号时间周期;根据流水号时间周期,生成初始化流水号;将初始化流水号设置为上次流水号。
(5)当在redis系统中查询到与流水号键对应的上次流水号时,获取上次流水号。
(6)根据上次流水号,确定上一时间周期;根据redis系统当前时间,确定当前时间周期;判断上一时间周期和当前时间周期的大小关系,得到时间周期判断结果。
(7)当上一时间周期与当前时间周期相同时,对上次流水号进行自增,生成当前流水号。
(8)当当前时间周期大于上一时间周期时,根据当前时间周期,生成当前流水号。
(9)当当前时间周期小于上一时间周期时,推送异常提示消息或者根据上一时间周期并对上次流水号进行自增得到当前流水号。
本实施例中,基于redis原子操作封装的流水号事务线程生成ID的方式,较数据库自增长方式效率更高,且不存在雪花片算法依赖与系统时间的一致性,如果系统时间被回调,或者改变,可能会造成id冲突或者重复的问题。
应该理解的是,虽然如上所述的各实施例所涉及的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,如上所述的各实施例所涉及的流程图中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
基于同样的发明构思,本申请实施例还提供了一种用于实现上述所涉及的流水号生成方法的流水号生成装置。该装置所提供的解决问题的实现方案与上述方法中所记载的实现方案相似,故下面所提供的一个或多个流水号生成装置实施例中的具体限定可以参见上文中对于流水号生成方法的限定,在此不再赘述。
在一个实施例中,如图5所示,提供了一种流水号生成装置,包括:获取模块502、确定模块504和生成模块506,其中:
获取模块502,用于获取流水号生成请求;
确定模块504,用于根据流水号生成请求,确定流水号键;
生成模块506,用于调用基于原子操作封装的流水号事务线程查询redis系统,生成当前流水号;
其中,流水号事务线程用于查询redis系统中与流水号键对应的上次流水号,根据上次流水号以及redis系统当前时间,生成当前流水号;上次流水号为redis系统当前时间之前最后一次生成的流水号。
在一个实施例中,生成模块506还用于当在redis系统中未查询到与流水号键对应的上次流水号时,生成初始化流水号;将初始化流水号设置为上次流水号。
在一个实施例中,生成模块506还用于当在redis系统中未查询到与流水号键对应的上次流水号时,获取redis系统当前时间;根据redis系统当前时间,确定流水号时间周期;根据流水号时间周期,生成初始化流水号。
在一个实施例中,生成模块506还用于根据上次流水号,确定上一时间周期;根据redis系统当前时间,确定当前时间周期;判断上一时间周期和当前时间周期的大小关系,得到时间周期判断结果;基于时间周期判断结果,生成当前流水号。
在一个实施例中,生成模块506还用于当上一时间周期与当前时间周期相同时,对上次流水号进行自增,生成当前流水号。
在一个实施例中,生成模块506还用于当当前时间周期大于上一时间周期时,根据当前时间周期,生成当前流水号。
在一个实施例中,生成模块506还用于当当前时间周期小于上一时间周期时,推送异常提示消息。
上述流水号生成装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是服务器,其内部结构图可以如图6所示。该计算机设备包括通过系统总线连接的处理器、存储器和网络接口。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质和内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储流水号事务线程中的命令、时间周期类型、时间周期长度以及上次流水号等数据。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种流水号生成方法。
本领域技术人员可以理解,图6中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现以下步骤:
获取流水号生成请求;
根据流水号生成请求,确定流水号键;
调用基于原子操作封装的流水号事务线程查询redis系统,生成当前流水号;
其中,流水号事务线程用于查询redis系统中与流水号键对应的上次流水号,根据上次流水号以及redis系统当前时间,生成当前流水号;上次流水号为redis系统当前时间之前最后一次生成的流水号。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:当在redis系统中未查询到与流水号键对应的上次流水号时,生成初始化流水号;将初始化流水号设置为上次流水号。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:当在redis系统中未查询到与流水号键对应的上次流水号时,生成初始化流水号包括:当在redis系统中未查询到与流水号键对应的上次流水号时,获取redis系统当前时间;根据redis系统当前时间,确定流水号时间周期;根据流水号时间周期,生成初始化流水号。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:根据上次流水号以及redis系统当前时间,生成当前流水号包括:根据上次流水号,确定上一时间周期;根据redis系统当前时间,确定当前时间周期;判断上一时间周期和当前时间周期的大小关系,得到时间周期判断结果;基于时间周期判断结果,生成当前流水号。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:基于时间周期判断结果,生成当前流水号包括:当上一时间周期与当前时间周期相同时,对上次流水号进行自增,生成当前流水号。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:基于时间周期判断结果,生成当前流水号包括:当当前时间周期大于上一时间周期时,根据当前时间周期,生成当前流水号。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:基于时间周期判断结果,生成当前流水号包括:当当前时间周期小于上一时间周期时,推送异常提示消息。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:
获取流水号生成请求;
根据流水号生成请求,确定流水号键;
调用基于原子操作封装的流水号事务线程查询redis系统,生成当前流水号;
其中,流水号事务线程用于查询redis系统中与流水号键对应的上次流水号,根据上次流水号以及redis系统当前时间,生成当前流水号;上次流水号为redis系统当前时间之前最后一次生成的流水号。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:当在redis系统中未查询到与流水号键对应的上次流水号时,生成初始化流水号;将初始化流水号设置为上次流水号。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:当在redis系统中未查询到与流水号键对应的上次流水号时,生成初始化流水号包括:当在redis系统中未查询到与流水号键对应的上次流水号时,获取redis系统当前时间;根据redis系统当前时间,确定流水号时间周期;根据流水号时间周期,生成初始化流水号。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:根据上次流水号以及redis系统当前时间,生成当前流水号包括:根据上次流水号,确定上一时间周期;根据redis系统当前时间,确定当前时间周期;判断上一时间周期和当前时间周期的大小关系,得到时间周期判断结果;基于时间周期判断结果,生成当前流水号。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:基于时间周期判断结果,生成当前流水号包括:当上一时间周期与当前时间周期相同时,对上次流水号进行自增,生成当前流水号。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:基于时间周期判断结果,生成当前流水号包括:当当前时间周期大于上一时间周期时,根据当前时间周期,生成当前流水号。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:基于时间周期判断结果,生成当前流水号包括:当当前时间周期小于上一时间周期时,推送异常提示消息。
在一个实施例中,提供了一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现以下步骤:
获取流水号生成请求;
根据流水号生成请求,确定流水号键;
调用基于原子操作封装的流水号事务线程查询redis系统,生成当前流水号;
其中,流水号事务线程用于查询redis系统中与流水号键对应的上次流水号,根据上次流水号以及redis系统当前时间,生成当前流水号;上次流水号为redis系统当前时间之前最后一次生成的流水号。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:当在redis系统中未查询到与流水号键对应的上次流水号时,生成初始化流水号;将初始化流水号设置为上次流水号。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:当在redis系统中未查询到与流水号键对应的上次流水号时,生成初始化流水号包括:当在redis系统中未查询到与流水号键对应的上次流水号时,获取redis系统当前时间;根据redis系统当前时间,确定流水号时间周期;根据流水号时间周期,生成初始化流水号。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:根据上次流水号以及redis系统当前时间,生成当前流水号包括:根据上次流水号,确定上一时间周期;根据redis系统当前时间,确定当前时间周期;判断上一时间周期和当前时间周期的大小关系,得到时间周期判断结果;基于时间周期判断结果,生成当前流水号。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:基于时间周期判断结果,生成当前流水号包括:当上一时间周期与当前时间周期相同时,对上次流水号进行自增,生成当前流水号。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:基于时间周期判断结果,生成当前流水号包括:当当前时间周期大于上一时间周期时,根据当前时间周期,生成当前流水号。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:基于时间周期判断结果,生成当前流水号包括:当当前时间周期小于上一时间周期时,推送异常提示消息。
需要说明的是,本申请所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read-OnlyMemory,ROM)、磁带、软盘、闪存、光存储器、高密度嵌入式非易失性存储器、阻变存储器(ReRAM)、磁变存储器(Magnetoresistive Random Access Memory,MRAM)、铁电存储器(Ferroelectric Random Access Memory,FRAM)、相变存储器(Phase Change Memory,PCM)、石墨烯存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓冲存储器等。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic RandomAccess Memory,DRAM)等。本申请所提供的各实施例中所涉及的数据库可包括关系型数据库和非关系型数据库中至少一种。非关系型数据库可包括基于区块链的分布式数据库等,不限于此。本申请所提供的各实施例中所涉及的处理器可为通用处理器、中央处理器、图形处理器、数字信号处理器、可编程逻辑器、基于量子计算的数据处理逻辑器等,不限于此。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请的保护范围应以所附权利要求为准。
Claims (10)
1.一种流水号生成方法,其特征在于,所述方法包括:
获取流水号生成请求;
根据所述流水号生成请求,确定流水号键;
调用基于原子操作封装的流水号事务线程查询redis系统,生成当前流水号;
其中,所述流水号事务线程用于查询redis系统中与流水号键对应的上次流水号,根据所述上次流水号以及redis系统当前时间,生成当前流水号;所述上次流水号为所述redis系统当前时间之前最后一次生成的流水号。
2.根据权利要求1所述的方法,其特征在于,还包括:
当在redis系统中未查询到与所述流水号键对应的上次流水号时,生成初始化流水号;
将所述初始化流水号设置为上次流水号。
3.根据权利要求2所述的方法,其特征在于,所述当在redis系统中未查询到与所述流水号键对应的上次流水号时,生成初始化流水号包括:
当在redis系统中未查询到与所述流水号键对应的上次流水号时,获取redis系统当前时间;
根据所述redis系统当前时间,确定流水号时间周期;
根据所述流水号时间周期,生成初始化流水号。
4.根据权利要求1所述的方法,其特征在于,所述根据所述上次流水号以及redis系统当前时间,生成当前流水号包括:
根据所述上次流水号,确定上一时间周期;
根据redis系统当前时间,确定当前时间周期;
判断所述上一时间周期和所述当前时间周期的大小关系,得到时间周期判断结果;
基于所述时间周期判断结果,生成当前流水号。
5.根据权利要求4所述的方法,其特征在于,所述基于所述时间周期判断结果,生成当前流水号包括:
当所述上一时间周期与所述当前时间周期相同时,对所述上次流水号进行自增,生成当前流水号。
6.根据权利要求4所述的方法,其特征在于,所述基于所述时间周期判断结果,生成当前流水号包括:
当所述当前时间周期大于所述上一时间周期时,根据所述当前时间周期,生成当前流水号。
7.根据权利要求4所述的方法,其特征在于,所述基于所述时间周期判断结果,生成当前流水号包括:
当所述当前时间周期小于所述上一时间周期时,推送异常提示消息。
8.一种流水号生成装置,其特征在于,所述装置包括:
获取模块,用于获取流水号生成请求;
确定模块,用于根据所述流水号生成请求,确定流水号键;
生成模块,用于调用基于原子操作封装的流水号事务线程查询redis系统,生成当前流水号;
其中,所述流水号事务线程用于查询redis系统中与流水号键对应的上次流水号,根据所述上次流水号以及redis系统当前时间,生成当前流水号;所述上次流水号为所述redis系统当前时间之前最后一次生成的流水号。
9.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至7中任一项所述的方法的步骤。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至7中任一项所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211480046.9A CN115729978A (zh) | 2022-11-24 | 2022-11-24 | 流水号生成方法、装置、计算机设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211480046.9A CN115729978A (zh) | 2022-11-24 | 2022-11-24 | 流水号生成方法、装置、计算机设备和存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115729978A true CN115729978A (zh) | 2023-03-03 |
Family
ID=85297848
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211480046.9A Pending CN115729978A (zh) | 2022-11-24 | 2022-11-24 | 流水号生成方法、装置、计算机设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115729978A (zh) |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8625803B1 (en) * | 2011-05-31 | 2014-01-07 | Google Inc. | Updating shared keys |
CN110619114A (zh) * | 2019-09-26 | 2019-12-27 | 北京明略软件系统有限公司 | 流水号生成方法及系统 |
CN111124359A (zh) * | 2019-12-20 | 2020-05-08 | 深圳猛犸电动科技有限公司 | 流水号生成方法、装置、系统、终端设备及存储介质 |
CN112559558A (zh) * | 2020-12-07 | 2021-03-26 | 北京理房通支付科技有限公司 | 一种流水号生成方法和装置、计算设备和存储介质 |
CN113190547A (zh) * | 2020-01-14 | 2021-07-30 | 深圳市茁壮网络股份有限公司 | 一种全局唯一且递增的id生成方法及系统 |
CN114153846A (zh) * | 2021-11-29 | 2022-03-08 | 北京无忧创想信息技术有限公司 | 一种快速生成分布式系统唯一id的方法及装置 |
CN115103024A (zh) * | 2022-06-21 | 2022-09-23 | 联仁健康医疗大数据科技股份有限公司 | 一种序列号生成方法、装置、电子设备及存储介质 |
-
2022
- 2022-11-24 CN CN202211480046.9A patent/CN115729978A/zh active Pending
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8625803B1 (en) * | 2011-05-31 | 2014-01-07 | Google Inc. | Updating shared keys |
CN110619114A (zh) * | 2019-09-26 | 2019-12-27 | 北京明略软件系统有限公司 | 流水号生成方法及系统 |
CN111124359A (zh) * | 2019-12-20 | 2020-05-08 | 深圳猛犸电动科技有限公司 | 流水号生成方法、装置、系统、终端设备及存储介质 |
CN113190547A (zh) * | 2020-01-14 | 2021-07-30 | 深圳市茁壮网络股份有限公司 | 一种全局唯一且递增的id生成方法及系统 |
CN112559558A (zh) * | 2020-12-07 | 2021-03-26 | 北京理房通支付科技有限公司 | 一种流水号生成方法和装置、计算设备和存储介质 |
CN114153846A (zh) * | 2021-11-29 | 2022-03-08 | 北京无忧创想信息技术有限公司 | 一种快速生成分布式系统唯一id的方法及装置 |
CN115103024A (zh) * | 2022-06-21 | 2022-09-23 | 联仁健康医疗大数据科技股份有限公司 | 一种序列号生成方法、装置、电子设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9491238B2 (en) | Rapid client-side component processing based on component relationships | |
EP3238421B1 (en) | System for high-throughput handling of transactions in data-partitioned, distributed, relational database management system | |
CN112631633B (zh) | 基于双芯智能电表的功能模块升级方法和装置 | |
EP2831774A1 (en) | Method and system for centralized issue tracking | |
US7072912B1 (en) | Identifying a common point in time across multiple logs | |
CN114780564A (zh) | 数据处理方法、数据处理装置、电子设备和存储介质 | |
US9852203B1 (en) | Asynchronous data journaling model in hybrid cloud | |
CN113157714B (zh) | 榜单数据更新方法、装置、电子设备及存储介质 | |
CN113360210A (zh) | 数据对账方法、装置、计算机设备和存储介质 | |
CN113645260A (zh) | 业务重试方法、装置、存储介质及电子设备 | |
CN115729978A (zh) | 流水号生成方法、装置、计算机设备和存储介质 | |
CN113296872A (zh) | 容器状态查询方法、装置、设备、存储介质和系统 | |
CN111435356A (zh) | 数据特征提取方法、装置、计算机设备以及存储介质 | |
CN117632395A (zh) | 工作流处理方法、装置、设备、存储介质和程序产品 | |
CN114816586A (zh) | 可见数据加载方法、装置、计算机设备和存储介质 | |
CN114168607A (zh) | 全局序列号生成方法、装置、设备、介质和产品 | |
AU2020452837A1 (en) | Provision of remote application action feed cards | |
CN114546974B (zh) | 一种数据的标注方法及装置 | |
CN115730016B (zh) | 数据同步方法、系统、装置、计算机设备和存储介质 | |
CN113987322A (zh) | 指标数据查询方法、装置、计算机设备和计算机程序产品 | |
CN114691331A (zh) | 网络数据处理方法、装置、计算机设备和存储介质 | |
CN116149750A (zh) | 数据处理方法、装置、计算机设备和存储介质 | |
CN116662338A (zh) | 一种数据存储方法、装置、设备及存储介质 | |
CN115330122A (zh) | 运营数据处理方法、装置、计算机设备及存储介质 | |
CN112733499A (zh) | 序列号生成方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20230303 |