数据更新的方法和装置
技术领域
本公开的实施例涉及计算机技术领域,具体涉及数据更新的方法和装置。
背景技术
随着互联网的普及,网络购物的优点更加突出,越来越多的用户开始选择网络购物。在网络购物平台中,用户通常可以在账户中预先存储金额或库存,当订单生成时可以在账户中进行相应的金额或库存扣减。
在一些业务场景中,订单生成强依赖账户值,不能出现账户超扣的情况,账户值不足时订单生成失败。例如,在物品秒杀时,限定物品的数量为50,账户值可以为仓库库存量,库存量可以从50开始扣减,但是不允许库存量为负值。现有技术中,经常会出现大量订单并发的情况,例如物品秒杀,此时账户扣减复杂度较高,容易出现超扣问题。
发明内容
本公开的实施例提出了数据更新的方法和装置。
第一方面,本公开的实施例提供了一种数据更新的方法,该方法包括:响应于接收到待生成订单,获取待生成订单的订单信息,其中,订单信息包括用户标识信息、账户扣减值和订单号;基于用户标识信息,在redis缓存中确定用户的缓存账户值,并以原子操作方式对所确定的缓存账户值执行扣减操作,其中,扣减操作用于对缓存账户值扣减待生成订单的账户扣减值;响应于确定出扣减操作的扣减结果大于或等于零,将扣减结果更新到缓存账户值;基于待生成订单的订单信息,构建待生成订单的扣减消息,将所构建的扣减消息插入消息中间件中的预先建立的消息队列中;响应于从消息队列获取到待生成订单的扣减消息,将redis缓存的变化同步到数据库中存储的用户的账户值,以更新账户值。
在一些实施例中,方法还包括:在基于待生成订单的订单信息,构建待生成订单的扣减消息之前,将待生成订单的订单信息插入预先建立的扣减信息待处理表;以及在将redis缓存的变化同步到数据库中存储的用户的账户值之后,在扣减信息待处理表中删除待生成订单的订单信息。
在一些实施例中,响应于从消息队列获取到待生成订单的扣减消息,将redis缓存的变化同步到数据库中存储的用户的账户值,以更新账户值,包括:响应于从消息队列获取到待生成订单的扣减消息,基于待生成订单的扣减消息,确定扣减信息待处理表是否存在待生成订单的订单信息;响应于确定出扣减信息待处理表中存在待生成订单的订单信息,采用乐观锁机制将数据库中存储的用户的账户值扣减账户扣减值,得到更新后的账户值。
在一些实施例中,方法还包括:响应于确定出扣减操作的扣减结果小于零,以原子操作方式对扣减结果执行增加操作,其中,增加操作用于对扣减结果增加待生成订单的账户扣减值;向用户发送账户值扣减失败的提示信息。
在一些实施例中,在响应于从消息队列获取到待生成订单的扣减消息,将redis缓存的变化同步到数据库中存储的用户的账户值,以更新账户值之前,方法包括:构建任务线程;利用任务线程从消息队列获取待生成订单的扣减消息。
在一些实施例中,方法还包括:响应于确定出用户的缓存账户值与账户扣减值之和不等于用户的账户值,确定缓存账户值是否大于第一预设阈值;响应于确定出缓存账户值大于第一预设阈值,判断缓存账户值在预设时间段内是否保持不变;若是,将数据库中存储的用户的账户值同步到用户的缓存账户值;若否,保持数据库存储的用户的缓存账户值不变。
在一些实施例中,方法还包括:响应于确定出缓存账户值小于或等于第一预设阈值,基于账户值、缓存账户值和账户扣减值确定账户值的误差值;判断误差值是否大于第二预设阈值;若是,将缓存账户值更新为预估值,其中,预估值为账户值与账户扣减值和第二预设阈值的差值;若否,将用户的账户值同步到用户的缓存账户值。
在一些实施例中,方法还包括:响应于确定出扣减信息待处理表中的数据量超过预设数据量,发送预设的报警信息。
在一些实施例中,将redis缓存、数据库部署在主集群;响应于主集群故障,将主集群的数据切换到预设的备用集群。
第二方面,本公开的实施例提供了一种数据更新的装置,装置包括:订单信息获取单元,被配置成响应于接收到待生成订单,获取待生成订单的订单信息,其中,订单信息包括用户标识信息、账户扣减值和订单号;缓存账户值确定单元,被配置成基于用户标识信息,在redis缓存中确定用户的缓存账户值,并以原子操作方式对所确定的缓存账户值执行扣减操作,其中,扣减操作用于对缓存账户值扣减待生成订单的账户扣减值;第一更新单元,被配置成响应于确定出扣减操作的扣减结果大于或等于零,将扣减结果更新到缓存账户值;扣减消息构建单元,被配置成基于待生成订单的订单信息,构建待生成订单的扣减消息,将所构建的扣减消息插入消息中间件中的预先建立的消息队列中;第二更新单元,被配置成响应于从消息队列获取到待生成订单的扣减消息,将redis缓存的变化同步到数据库中存储的用户的账户值,以更新账户值。
在一些实施例中,装置还包括:信息插入单元,被配置成在基于待生成订单的订单信息,构建待生成订单的扣减消息之前,将待生成订单的订单信息插入预先建立的扣减信息待处理表;以及信息删除单元,被配置成在将redis缓存的变化同步到数据库中存储的用户的账户值之后,在扣减信息待处理表中删除待生成订单的订单信息。
在一些实施例中,第二更新单元进一步被配置成,包括:响应于从消息队列获取到待生成订单的扣减消息,基于待生成订单的扣减消息,确定扣减信息待处理表是否存在待生成订单的订单信息;响应于确定出扣减信息待处理表中存在待生成订单的订单信息,采用乐观锁机制将数据库中存储的用户的账户值扣减账户扣减值,得到更新后的账户值。
在一些实施例中,装置还包括:增加操作执行单元,被配置成响应于确定出扣减操作的扣减结果小于零,以原子操作方式对扣减结果执行增加操作,其中,增加操作用于对扣减结果增加待生成订单的账户扣减值;发送单元,被配置成向用户发送账户值扣减失败的提示信息。
在一些实施例中,装置还包括:任务线程构建单元,被配置成构建任务线程;扣减消息获取单元,被配置成利用任务线程从消息队列获取待生成订单的扣减消息。
在一些实施例中,装置还包括:第一确定单元,被配置成响应于确定出用户的缓存账户值与账户扣减值之和不等于用户的账户值,确定缓存账户值是否大于第一预设阈值;第一判断单元,被配置成响应于确定出缓存账户值大于第一预设阈值,判断缓存账户值在预设时间段内是否保持不变;若是,将数据库中存储的用户的账户值同步到用户的缓存账户值;若否,保持数据库存储的用户的缓存账户值不变。
在一些实施例中,装置还包括:第二确定单元,被配置成响应于确定出缓存账户值小于或等于第一预设阈值,基于账户值、缓存账户值和账户扣减值确定账户值的误差值;第二判断单元,被配置成判断误差值是否大于第二预设阈值;若是,将缓存账户值更新为预估值,其中,预估值为账户值与账户扣减值和第二预设阈值的差值;若否,将用户的账户值同步到用户的缓存账户值。
在一些实施例中,装置还包括:报警信息发送单元,被配置成响应于确定出扣减信息待处理表中的数据量超过预设数据量,发送预设的报警信息。
在一些实施例中,装置还包括:部署单元,被配置成将redis缓存、数据库部署在主集群;切换单元,被配置成响应于主集群故障,将主集群的数据切换到预设的备用集群。
本公开的实施例提供的数据更新的方法和装置,在接收到待生成订单的情况下,可以获取该待生成订单的订单信息,之后基于用户标识信息,在redis缓存中确定用户的缓存账户值,并以原子操作方式对所确定的缓存账户值执行扣减操作,然后响应于确定出扣减操作的扣减结果大于或等于零,将该扣减结果更新到缓存账户值,而后基于待生成订单的订单信息,构建待生成订单的扣减消息,将所构建的扣减消息插入消息中间件中的预先建立的消息队列中,最后响应于从消息队列获取到待生成订单的扣减消息,将redis缓存的变化同步到数据库中存储的用户的账户值,以实现更新账户值,从而有效利用了redis缓存进行原子扣减操作,避免在数据高并发情况下出现直接对数据库中的账户值扣减造成超扣的问题。
附图说明
通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本公开的其它特征、目的和优点将会变得更明显:
图1是本公开的一些实施例可以应用于其中的示例性系统架构图;
图2是根据本公开的数据更新的方法的一个实施例的流程图;
图3是根据本公开的实施例的数据更新的方法中用于数据更新补偿的方法的一个实现方式的流程图;
图4是根据本公开的数据更新的方法中的又一个实施例的流程图;
图5是根据本公开的数据更新的装置的一个实施例的结构示意图;
图6是适于用来实现本公开的实施例的电子设备的结构示意图。
具体实施方式
下面结合附图和实施例对本公开作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释相关发明,而非对该发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与有关发明相关的部分。
需要说明的是,在不冲突的情况下,本公开中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本公开。
图1示出了可以应用本公开的实施例的数据更新的方法或数据更新的装置的示例性系统架构100。
如图1所示,系统架构100可以包括终端设备101、102、103,网络104和服务器105。网络104用以在终端设备101、102、103和服务器105之间提供通信链路的介质。网络104可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
用户可以使用终端设备101、102、103通过网络104与服务器105交互,以接收或发送消息等。终端设备101、102、103上可以安装有各种通讯客户端应用,例如购物类应用、网页浏览器应用、搜索类应用、即时通信工具、邮箱客户端、社交平台软件等。
终端设备101、102、103可以是硬件,也可以是软件。当终端设备101、102、103为硬件时,可以是具有显示屏并且支持网络购物的各种电子设备,包括但不限于智能手机、平板电脑、电子书阅读器、膝上型便携计算机和台式计算机等等。当终端设备101、102、103为软件时,可以安装在上述所列举的电子设备中。其可以实现成例如用来提供分布式服务的多个软件或软件模块,也可以实现成单个软件或软件模块。在此不做具体限定。
服务器105可以是提供各种服务的服务器。服务器105可以对接收到的待生成订单的账户扣减值执行原子扣减操作,并将扣减结果更新到缓存账户值,而后服务器可以构建待生成订单的扣减消息,并将扣减消息插入消息队列,以及在从消息队列获取到待生成订单的扣减消息时,将redis缓存的变化同步到数据库中存储的用户的账户值,以更新账户值。进一步地,服务器还可以将更新后的账户值反馈给终端设备。
需要说明的是,本公开的实施例所提供的数据更新的方法可以由服务器105执行。相应地,数据更新的装置可以设置于服务器105中。
需要说明的是,服务器可以是硬件,也可以是软件。当服务器为硬件时,可以实现成多个服务器组成的分布式服务器集群,也可以实现成单个服务器。当服务器为软件时,可以实现成例如用来提供分布式服务的多个软件或软件模块,也可以实现成单个软件或软件模块。在此不做具体限定。
应该理解,图1中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。
继续参考图2,示出了根据本公开的数据更新的方法的一个实施例的流程200。该数据更新的方法,包括以下步骤:
步骤201,响应于接收到待生成订单,获取待生成订单的订单信息。
在本实施例中,在数据更新的方法的执行主体(例如图1所示的服务器)接收到待生成订单的情况下,可以获取该待生成订单的订单信息。这里,订单信息可以包括用户的标识信息、账户扣减值和订单号。上述用户标识信息中的用户可以为在电商平台中的商家,用户标识信息可以为电商平台中商家的标识信息,上述账户扣减值可以为待生成订单所需要在账户扣减的值。可以理解的是,上述用户标识信息中的用户还可以为在电商平台中购物的购物者,这里没有唯一的限定。
通常,账户扣减值可以为扣减物品数量值、扣减金额值等。电商平台在接收到待生成订单后,可以在用户(例如商家)的账户中扣减账户扣减值。作为示例,上述用户可以为电商平台中的医药商家,该医药商家可以预先在账户充值购买问诊权益,购物者在该医药商家购物时可以使用该医药商家所购买的问诊权益进行问诊,此时可以对医药商家的账户余额进行扣减消费。
步骤202,基于用户标识信息,在redis缓存中确定用户的缓存账户值,并以原子操作方式对所确定的缓存账户值执行扣减操作。
在本实施例中,基于步骤201所获取的用户标识信息和账户扣减值,上述执行主体(例如图1所示的服务器)可以在redis缓存中确定出用户的缓存账户值。而后,上述执行主体可以以原子操作的方式对所确定的缓存账户值执行扣减操作,在该用户的当前缓存账户值的基础上扣减上述账户扣减值,得到该扣减操作的扣减结果。作为示例,上述执行主体可以通过redis的原子指令decrby进行缓存账户值扣减操作,得到扣减结果。可以理解的是,上述执行主体往往可以得到该用户的多个并发的待生成订单,其需要针对每个待生成订单进行扣减,采用原子操作方式进行扣减可以使得各待生成订单在执行相应的扣减操作时不被中断,从而不会出现待生成订单并发导致的数据覆盖的问题。
步骤203,响应于确定出扣减操作的扣减结果大于或等于零,将扣减结果更新到缓存账户值。
在本实施例中,基于步骤202的扣减操作,上述执行主体可以得到该扣减操作的扣减结果。而后,上述执行主体可以判断该扣减操作的扣减结果是否大于或等于零。如果扣减结果大于或等于零,上述执行主体可以将该扣减结果更新到上述用户的缓存账户值,此时用户的缓存账户值可以与扣减结果相同。可以理解的是,上述扣减结果大于或等于零可以表明上述用户的缓存账户值没有被超扣。
步骤204,基于待生成订单的订单信息,构建待生成订单的扣减消息,将所构建的扣减消息插入消息中间件中的预先建立的消息队列中。
在本实施例中,上述执行主体可以基于待生成订单的订单信息构建该待生成订单的扣减消息。而后,上述执行主体可以将所构建的扣减消息插入预先建立的消息队列。其中,上述消息队列可以为消息中间件中建立的消息队列,该消息队列可以利用消息中间件来实现异步的消息队列机制。上述扣减消息可以包括待生成订单的订单号、用户标识信息和账户扣减值,其中,订单号和用户标识信息结合具有较强的唯一性,可以用来防止消息队列中出现重复的扣减消息。
步骤205,响应于从消息队列获取到待生成订单的扣减消息,将redis缓存的变化同步到数据库中存储的用户的账户值,以更新账户值。
在本实施例中,上述用户的账户值可以存储在预设的数据库中。上述执行主体可以采用各种方式从消息队列中获取待生成订单的扣减消息。在确定获取到该扣减消息的情况下,上述执行主体可以将redis缓存的变化同步到数据库中用户的账户值,从而实现对上述用户的账户中数据的更新。
在本实施例的一些可选的实现方式中,上述执行主体可以将更新后的账户值发送到终端设备,此时终端设备显示的账户值为扣减上述待生成订单对应的账户扣减值后得到的值。进一步地,账户值扣减成功后可以表明上述用户的账户值没有被超扣,该用户的账户值不会影响待生成订单的生成。
在本实施例的一些可选的实现方式中,上述执行主体在执行步骤205之前,可以构建任务线程,该任务线程可以用于从消息队列中拉取扣减消息。上述执行主体可以利用所构建的任务线程从消息队列中拉取待生成订单的扣减消息。可以理解的是,消息队列中可以包含大量的扣减消息,每台服务器可以均由单任务线程从消息队列中拉取扣减消息,因此各服务器实现了串行化处理订单的扣减任务,从而减少了并发操作对数据库的热点竞争问题,减少了数据库的账户值更新上的并发冲突,提高了扣减任务的准确性。可以理解的是,上述消息队列还可以采用推送的方式将扣减消息推送到上述待执行主体,这里没有唯一的限定。
在本实施例的一些可选的实现方式中,上述执行主体可以将数据库中存储的用户的账户值扣减所获取的账户扣减值,从而可以得到更新后的账户值。在待生成订单高并发的情况下,redis缓存中用户的缓存账户值可能在较短的时间内执行多次扣减操作,将数据库中存储的用户的账户值扣减账户扣减值,可以避免出现redis缓存中已经多次执行扣减操作,而数据库的账户值还未进行扣减导致数据库跨任务扣减的情况,该情况会使得数据库的账户值的扣减与日志不同步。可以理解的是,上述执行主体体还可以采用其它方式进行账户值同步,例如,可以将redis缓存中的数据直接同步到数据库,这里没有唯一的限定。
在申请的本实施例提供的数据更新的方法中还可以包括数据更新补偿步骤,如图3所示,其示出了根据本实施例的数据更新方法中用于数据更新补偿的方法的一个实现方式的流程图。在数据更新出现问题时,该实现方式所提供的数据更新补偿方法可以对存在问题的更新数据进行补偿,从而进一步提高了数据更新的准确性。该数据更新补偿方法可以包括如下步骤:
步骤301,响应于确定出用户的缓存账户值与账户扣减值之和不等于用户的账户值,确定缓存账户值是否大于第一预设阈值。
在本实现方式中,上述执行主体可以计算上述用户的缓存账户值与账户扣减值之和,而后判断计算得到的和值是否等于数据库中存储的用户的账户值。可以理解的是,如果上述用户的缓存账户值与账户扣减值之和不等于数据库中存储的用户的账户值,则可以确定出采用步骤201~步骤205更新得到的账户值不准确,而后上述执行主体可以进一步确定缓存账户值是否大于第一预设阈值。这里,第一预设阈值可以为安全库存值,在缓存账户值大于该安全库存值的情况下,则可以认为缓存账户值较大,短时间内不会出现账户值超扣的情况。该安全库存值可以是根据用户的历史订单和/或当前促销活动相结合进行预估得到的值,安全库存值可以是一个动态变化的值。
步骤302,响应于确定出缓存账户值大于第一预设阈值,判断缓存账户值在预设时间段内是否保持不变。
在本实现方式中,上述执行主体在确定出缓存账户值大于第一预设阈值的情况下,则可以认为缓存账户值较大,短时间内不会出现账户值超扣的情况。进一步地,上述执行主体可以继续判断缓存账户值在预设时间段内是否保持不变。具体地,若上述执行主体累计n(n为大于或等于1的正整数)次缓存账户值不变,则可以认为缓存账户值在预设时间段内没有发生变化,这里的n可以根据实际的需求进行设置。可以理解的是,若上述执行主体确定出缓存账户值在预设时间段内保持不变,则可以转到步骤303,否则可以转到步骤304。
步骤303,将数据库中存储的用户的账户值同步到用户的缓存账户值。
在本实现方式中,基于步骤302确定出的缓存账户值在预设时间段内保持不变,则可以表明此时业务空闲,此时可以将数据库中存储的上述用户的账户值同步到该用户的缓存账户值。
步骤304,保持数据库存储的用户的缓存账户值不变。
在本实现方式中,基于步骤302确定出的缓存账户值在预设时间段内发生了变化,则可以表明此时存在缓存账户值扣减需求,业务繁忙。由于上述用户的缓存账户值大于第一预设阈值,即使不对更新后的账户值进行补偿短时间内也不会出现账户值超扣的情况,因此可以继续保持上述用户的缓存账户值不变。
可以理解的是,在采用本申请上述实施例提供的数据更新的方法更新账户值的过程,可以定期执行本实现方式公开的数据更新补偿方法。因此,虽然在数据更新补偿的过程中随时可能发生扣减操作造成缓存账户值可能存在偏差,但是数据更新补偿定期不断的执行,在下一次数据更新补偿中可以再次对偏差的数据进行补偿,因此扣减操作不会影响本申请的数据更新的方法的执行。
在一些可选的实现方式中,上述执行主体在确定出缓存账户值小于或等于第一预设阈值的情况下,则可以认为缓存账户值较小,此种情况下缓存账户值的偏差很可能会影响到业务的进行。因此,需要及时对缓存账户值进行更正。上述执行主体首先可以基于上述用户的账户值、缓存账户值各账户扣减值计算账户值的误差值,而后判断该误差值是否大于第二预设阈值。具体地,误差值a可以通过如下公式计算得到:a=|b-c-d|,其中,b表示账户值,c表示缓存账户值,d表示账户扣减值。上述第二预设阈值可以为安全动态值,该第二预设值可以为在获取账户值、缓存账户值等数据的期间缓存账户值可能发生的扣减数值,该第二预设阈值可以根据经验进行设置。
进一步地,上述执行主体在确定出误差值a大于第二阈值的情况下,可以将缓存账户值更新为预估值。该预估值可以为上述用户的账户值与账户扣减值和第二预设阈值的差值,基于该方式得到的预估值相比实际的缓存账户值可能是偏小的,从而可以避免出现账户值超扣情况的发生。具体地,预估值e可以通过如下公式计算得到:e=b-d-f,其中,b表示账户值,d表示账户扣减值,f表示第二预设阈值。进一步地,上述执行主体在确定出误差值a小于或等于第二阈值的情况下,可以将上述用户的账户值同步到缓存账户值。
在一些可选的实现方式中,上述执行主体可以获取上述用户在redis缓存中的缓存账户值和在数据库中的账户值。如果所获取的缓存账户值和账户值在预设时长内始终相差第一预设阈值,上述执行主体可以在业务空闲时将所获取的账户值同步到缓存账户值中。需要说明的是,上述缓存账户值在预设时间段内保持不变则可以表明业务空闲。该实现方式公开的方案可以作为对账户值托底的纠正措施,进一步保证了账户值和缓存账户值的准确性。
本实现方式提供的数据更新补偿方法,可以解决数据更新过程中缓存账户值与实际缓存账户值不一致的问题,提高了数据更新的准确性。
本申请的上述实施例提供的方法,在接收到待生成订单的情况下,可以获取该待生成订单的订单信息,之后基于用户标识信息,在redis缓存中确定用户的缓存账户值,并以原子操作方式对所确定的缓存账户值执行扣减操作,然后响应于确定出扣减操作的扣减结果大于或等于零,将该扣减结果更新到缓存账户值,而后基于待生成订单的订单信息,构建待生成订单的扣减消息,将所构建的扣减消息插入消息中间件中的预先建立的消息队列中,最后响应于从消息队列获取到待生成订单的扣减消息,将redis缓存的变化同步到数据库中存储的用户的账户值,以实现更新账户值,从而有效利用了redis缓存进行原子扣减操作,避免在数据高并发情况下出现直接对数据库中的账户值扣减造成超扣的问题。
进一步参考图4,其示出了数据更新的方法的又一个实施例的流程400。该数据更新的方法的流程400,包括以下步骤:
步骤401,响应于接收到待生成订单,获取待生成订单的订单信息。
步骤402,基于用户标识信息,在redis缓存中确定用户的缓存账户值,并以原子操作方式对所确定的缓存账户值执行扣减操作。
步骤403,响应于确定出扣减操作的扣减结果大于或等于零,将扣减结果更新到缓存账户值。
在本实施例中,上述步骤401~步骤403所包含的内容与上述实施例中的步骤201~步骤203相似,这里不再赘述。
步骤404,将待生成订单的订单信息插入预先建立的扣减信息待处理表。
在本实施例中,可以在数据库层预先建立扣减信息待处理表。上述执行主体可以将待生成订单的订单信息插入该扣减信息待处理表中。该扣减信息待处理表中至少可以包括订单信息中的用户标识信息、订单号和账户扣减值。可选地,该扣减信息待处理表中还可以包括订单的状态信息,例如,该订单的缓存账户值是否更新完成等状态信息。可以理解的是,上述扣减信息待处理表插入的是订单维度的数据,扣减信息待处理表不存在信息的修改,因此在待生成订单量高并发的情况下,扣减信息待处理表中也不存在热点竞争的问题,性能稳定。
在本实施例的一些可选的实现方式中,响应于确定出上述扣减操作的扣减结果小于零,即上述用户的缓存账户值出现超扣的情况,上述执行主体可以以原子操作方式对扣减结果执行增加操作,从而使得缓存账户值可以恢复到本次扣减操作之前的大小。其中,增加操作可以用于对扣减结果增加待生成订单的账户扣减值,该增加操作可以通过redis的原子指令incrby来实现。最后,上述执行主体可以向用户发送账户值扣减失败的提示信息。
步骤405,基于待生成订单的订单信息,构建待生成订单的扣减消息,将所构建的扣减消息插入消息中间件中的预先建立的消息队列中。
在本实施例中,上述执行主体可以基于待生成订单的订单信息构建该待生成订单的扣减消息。而后,上述执行主体可以将所构建的扣减消息插入预先建立的消息队列。其中,上述消息队列可以为消息中间件中建立的消息队列,该消息队列可以利用消息中间件来实现异步的消息队列机制。上述扣减消息可以包括待生成订单的订单号、用户标识信息和账户扣减值,其中,订单号和用户标识信息结合具有较强的唯一性,可以用来防止消息队列中出现重复的扣减消息。
步骤406,响应于从消息队列获取到待生成订单的扣减消息,基于待生成订单的扣减消息,确定扣减信息待处理表是否存在待生成订单的订单信息。
在本实施例中,上述执行主体从消息队列中获取到待生成订单的扣减信息之后,可以基于待生成订单的扣减信息,在扣减信息处理表中通过订单信息匹配等方式确定是否存在待生成订单的订单信息。
步骤407,响应于确定出扣减信息待处理表中存在待生成订单的订单信息,采用乐观锁机制将数据库中存储的用户的账户值扣减账户扣减值,得到更新后的账户值。
在本实施例中,上述执行主体在确定出扣减信息待处理表中存在待生成订单的订单信息的情况下,可以采用乐观锁机制将数据中存储的上述用户的账户值扣减上述账户扣减值,从而可以得到更新后的账户值。可以理解的是,上述执行主体可以从订单信息中获取上述账户扣减值,或者还可以从扣减信息待处理表获取账户扣减值。上述执行主体可以采用串行的方式从扣减消息队列中拉取扣减消息,因此上述执行主体在采用乐观锁机制进行账户值更新时可以极大地减少数据库账户值更新的并发冲突,提高了账户更新的准确性。
需要说明的是,对于上述待生成订单,上述执行主体在数据库中完成该待生成订单的账户扣减值的扣减之后,可以在扣减信息待处理表中删除该待生成订单的订单信息。因此,若上述扣减信息待处理表中存在待生成订单的订单信息,则可以表明上述用户的账户值还没有被更新,上述执行主体可以更新该用户的账户值。
步骤408,在扣减信息待处理表中删除待生成订单的订单信息。
在本实施例中,在数据库中用户的账户值更新完成后,上述执行主体可以在扣减信息待处理表中删除该待处理订单的订单信息。可以理解的是,在完成账户值更新后,删除扣减信息待处理表中的待处理订单的订单信息,可以避免针对同一待处理订单重复更新数据库中的账户值,从而有效地防止出现数据库中账户值的重复更新,提高了数据更新的准确性。
在本实施例的一些可选的实现方式中,上述执行主体还可以获取扣减信息待处理表中的数据量,若扣减信息待处理表中的数据量大于预设数据量,则可以表明消息中间件中的消息队列可能存在消息通道故障,从而导致redis缓存的变化不能及时更新到数据库的账户值。此时可以发送预设的报警信息,以通知技术人员。
在本实施例的一些可选的实现方式中,本申请的上述实施例提供的数据更新的方法在进行账户值更新时依赖redis缓存,因此可以设置redis双集群(包括主集群和备用集群)。首先可以将redis缓存、数据库部署在主集群上。在主集群出现故障时,可以将主集群中的数据切换到备用集群。从而可以避免出现因主集群故障导致的数据更新错误的情况。
从图4中可以看出,与图2对应的实施例相比,本实施例中的数据更新的方法的流程400突出了利用扣减信息待处理表实现的数据更新的防重机制。本实施例描述的方案可以将待生成订单的订单信息插入预先建立的扣减信息待处理表,在从消息队列获取到待生成订单的扣减消息后可以判断扣减信息待处理表中是否存在扣减消息,并在确定出存在扣减消息的情况下进行账户值的更新,从而避免出现针对同一待生成订单对数据库存储的账户值重复更新的情况,进一步提高了数据更新的准确性。
进一步参考图5,作为对上述各图所示方法的实现,本公开提供了一种数据更新的装置的一个实施例,该装置实施例与图2所示的方法实施例相对应,该装置具体可以应用于各种电子设备中。
如图5所示,本实施例的数据更新的装置500包括:订单信息获取单元501、缓存账户值确定单元502、第一更新单元503、扣减消息构建单元504和第二更新单元505。其中,订单信息获取单元501被配置成响应于接收到待生成订单,获取待生成订单的订单信息,其中,订单信息包括用户标识信息、账户扣减值和订单号;缓存账户值确定单元502被配置成基于用户标识信息,在redis缓存中确定用户的缓存账户值,并以原子操作方式对所确定的缓存账户值执行扣减操作,其中,扣减操作用于对缓存账户值扣减待生成订单的账户扣减值;第一更新单元503被配置成响应于确定出扣减操作的扣减结果大于或等于零,将扣减结果更新到缓存账户值;扣减消息构建单元504被配置成基于待生成订单的订单信息,构建待生成订单的扣减消息,将所构建的扣减消息插入消息中间件中的预先建立的消息队列中;第二更新单元505被配置成响应于从消息队列获取到待生成订单的扣减消息,将redis缓存的变化同步到数据库中存储的用户的账户值,以更新账户值。
在本实施例的一些可选的实现方式中,装置500还包括:信息插入单元,被配置成在基于待生成订单的订单信息,构建待生成订单的扣减消息之前,将待生成订单的订单信息插入预先建立的扣减信息待处理表;以及信息删除单元,被配置成在将redis缓存的变化同步到数据库中存储的用户的账户值之后,在扣减信息待处理表中删除待生成订单的订单信息。
在本实施例的一些可选的实现方式中,第二更新单元505进一步被配置成,包括:响应于从消息队列获取到待生成订单的扣减消息,基于待生成订单的扣减消息,确定扣减信息待处理表是否存在待生成订单的订单信息;响应于确定出扣减信息待处理表中存在待生成订单的订单信息,采用乐观锁机制将数据库中存储的用户的账户值扣减账户扣减值,得到更新后的账户值。
在本实施例的一些可选的实现方式中,装置500还包括:增加操作执行单元,被配置成响应于确定出扣减操作的扣减结果小于零,以原子操作方式对扣减结果执行增加操作,其中,增加操作用于对扣减结果增加待生成订单的账户扣减值;发送单元,被配置成向用户发送账户值扣减失败的提示信息。
在本实施例的一些可选的实现方式中,装置500还包括:任务线程构建单元,被配置成构建任务线程;扣减消息获取单元,被配置成利用任务线程从消息队列获取待生成订单的扣减消息。
在本实施例的一些可选的实现方式中,装置500还包括:第一确定单元,被配置成响应于确定出用户的缓存账户值与账户扣减值之和不等于用户的账户值,确定缓存账户值是否大于第一预设阈值;第一判断单元,被配置成响应于确定出缓存账户值大于第一预设阈值,判断缓存账户值在预设时间段内是否保持不变;若是,将数据库中存储的用户的账户值同步到用户的缓存账户值;若否,保持数据库存储的用户的缓存账户值不变。
在本实施例的一些可选的实现方式中,装置500还包括:第二确定单元,被配置成响应于确定出缓存账户值小于或等于第一预设阈值,基于账户值、缓存账户值和账户扣减值确定账户值的误差值;第二判断单元,被配置成判断误差值是否大于第二预设阈值;若是,将缓存账户值更新为预估值,其中,预估值为账户值与账户扣减值和第二预设阈值的差值;若否,将用户的账户值同步到用户的缓存账户值。
在本实施例的一些可选的实现方式中,装置500还包括:报警信息发送单元,被配置成响应于确定出扣减信息待处理表中的数据量超过预设数据量,发送预设的报警信息。
在本实施例的一些可选的实现方式中,装置500还包括:部署单元,被配置成将redis缓存、数据库部署在主集群;切换单元,被配置成响应于主集群故障,将主集群的数据切换到预设的备用集群。
装置500中记载的诸单元与参考图2描述的方法中的各个步骤相对应。由此,上文针对方法描述的操作和特征同样适用于装置500及其中包含的单元,在此不再赘述。
下面参考图6,其示出了适于用来实现本公开的实施例的电子设备(例如图1中的服务器)600的结构示意图。图6示出的电子设备仅仅是一个示例,不应对本公开的实施例的功能和使用范围带来任何限制。
如图6所示,电子设备600可以包括处理装置(例如中央处理器、图形处理器等)601,其可以根据存储在只读存储器(ROM)602中的程序或者从存储装置608加载到随机访问存储器(RAM)603中的程序而执行各种适当的动作和处理。在RAM 603中,还存储有电子设备600操作所需的各种程序和数据。处理装置601、ROM 602以及RAM 603通过总线604彼此相连。输入/输出(I/O)接口605也连接至总线604。
通常,以下装置可以连接至I/O接口605:包括例如触摸屏、触摸板、键盘、鼠标、摄像头、麦克风、加速度计、陀螺仪等的输入装置606;包括例如液晶显示器(LCD)、扬声器、振动器等的输出装置607;包括例如磁带、硬盘等的存储装置608;以及通信装置609。通信装置609可以允许电子设备600与其他设备进行无线或有线通信以交换数据。虽然图6示出了具有各种装置的电子设备600,但是应理解的是,并不要求实施或具备所有示出的装置。可以替代地实施或具备更多或更少的装置。图6中示出的每个方框可以代表一个装置,也可以根据需要代表多个装置。
特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信装置609从网络上被下载和安装,或者从存储装置608被安装,或者从ROM 602被安装。在该计算机程序被处理装置601执行时,执行本公开的实施例的方法中限定的上述功能。需要说明的是,本公开的实施例所述的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开的实施例中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本公开的实施例中,计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读信号介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:电线、光缆、RF(射频)等等,或者上述的任意合适的组合。
上述计算机可读介质可以是上述电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该电子设备执行时,使得该电子设备:响应于接收到待生成订单,获取待生成订单的订单信息,其中,订单信息包括用户标识信息、账户扣减值和订单号;基于用户标识信息,在redis缓存中确定用户的缓存账户值,并以原子操作方式对所确定的缓存账户值执行扣减操作,其中,扣减操作用于对缓存账户值扣减待生成订单的账户扣减值;响应于确定出扣减操作的扣减结果大于或等于零,将扣减结果更新到缓存账户值;基于待生成订单的订单信息,构建待生成订单的扣减消息,将所构建的扣减消息插入消息中间件中的预先建立的消息队列中;响应于从消息队列获取到待生成订单的扣减消息,将redis缓存的变化同步到数据库中存储的用户的账户值,以更新账户值。
可以以一种或多种程序设计语言或其组合来编写用于执行本公开的实施例的操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(LAN)或广域网(WAN)——连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本公开的实施例中所涉及到的单元可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的单元也可以设置在处理器中,例如,可以描述为:一种处理器包括订单信息获取单元缓存账户值确定单元、第一更新单元、扣减消息构建单元和第二更新单元。其中,这些单元的名称在某种情况下并不构成对该单元本身的限定,例如,订单信息获取单元还可以被描述为“响应于接收到待生成订单,获取待生成订单的订单信息”。
以上描述仅为本公开的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本公开的实施例中所涉及的发明范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离上述发明构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本公开的实施例中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。