CN109255701B - 一种网贷业务数据处理方法 - Google Patents
一种网贷业务数据处理方法 Download PDFInfo
- Publication number
- CN109255701B CN109255701B CN201810983953.2A CN201810983953A CN109255701B CN 109255701 B CN109255701 B CN 109255701B CN 201810983953 A CN201810983953 A CN 201810983953A CN 109255701 B CN109255701 B CN 109255701B
- Authority
- CN
- China
- Prior art keywords
- data
- redis
- service
- hashes
- data structure
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06Q—INFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
- G06Q40/00—Finance; Insurance; Tax strategies; Processing of corporate or income taxes
- G06Q40/03—Credit; Loans; Processing thereof
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/524—Deadlock detection or avoidance
Landscapes
- Engineering & Computer Science (AREA)
- Business, Economics & Management (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- Accounting & Taxation (AREA)
- Finance (AREA)
- Software Systems (AREA)
- General Physics & Mathematics (AREA)
- Development Economics (AREA)
- Technology Law (AREA)
- General Business, Economics & Management (AREA)
- Strategic Management (AREA)
- Marketing (AREA)
- Economics (AREA)
- General Engineering & Computer Science (AREA)
- Financial Or Insurance-Related Operations Such As Payment And Settlement (AREA)
Abstract
本发明提供一种网贷业务数据处理方法,该方法使用Redis的Hashes结构实现网贷业务处理,不需要锁定整个业务流程,在还款分配、逾期分配和转让债权的业务流程开始时判断是否可以获取锁,并调用Redis的Hashes数据结构进行加锁运算操作;在业务流程结束时调用Redis的Hashes数据结构进行数据删除的解锁运算操作,从而降低了工作量,实现了运算、判断和锁定时间短以及效率高的技术效果。另外,该方法还实现了转让债权和转让债权业务在借款申请ID相同和债权ID不同的情况下的并发而其他业务场景均不能并发,并且解决了同一个借款申请下的不同债权不能同时进行业务处理的问题,从而极大地提升了业务效率。
Description
技术领域
本发明涉及数据处理技术领域,尤其涉及一种网贷业务数据处理方法。
背景技术
在网贷业务发展初期,公司经历了野蛮增长、快速抢占市场的阶段。在这个阶段,所有业务都致力于快速实现。债权数据处于网贷最底层,也是最核心的数据,几乎所有业务流程都会对债权数据进行运算、更新。对于业务流程并发导致的数据一致性问题,传统技术方案采取相对简单且可实现分布式的关系型数据库悲观锁for update方式。在查询到一条债权数据的同时,对债权数据进行加锁,其他业务对该数据的增、删、改、查都需要等待,直到该业务计算和更新完成后,才会允许下一个业务对该条债权数据进行操作。
然而,随着客户量、债权数据量、业务量的增大,出现了两方面的问题。首先,由于业务量增大,等待锁来操作债权数据的数据库连接越来越多,数据库压力越来越大,业务高峰期甚至出现数据库宕机的情况。另外,基于数据库悲观锁的特性,同一个债权数据操作为顺序执行,大大降低了业务执行的效率,业务执行时间越来越长。基于上述问题,业务系统拆分、系统服务化和优化迫在眉睫。在这些工作进行期间,还款分配、逾期分配和转让债权等业务,依赖时间差来尽量避免业务并发出现的数据一致性问题。但由于庞大的业务量导致执行时间很长,仍然会有并发的情况出现。
随着微服务架构中的服务注册和发现的搭建,业务系统逐渐拆分为各个微服务,数据库悲观锁也升级为分布式锁。分布式锁目前比较常用的有基于Zookeeper实现的分布式锁和基于缓存(Redis)实现的分布式锁。
其中,使用Zookeeper技术上是基于Zookeeper临时有序节点实现的分布式锁。每个客户端对某个方法加锁时,在Zookeeper上与该方法对应的指定节点的目录下,生成一个唯一的瞬时有序节点。判断是否获取锁的方式很简单,只需要判断有序节点中序号最小的一个。当释放锁的时候,只需将这个瞬时节点删除即可。这种方式可以避免因服务宕机导致锁无法释放而产生的死锁问题。但是,Zookeeper实现的分布式锁存在效率不高的缺点。
另外,Redisson是一种基于缓存Redis的分布式锁,效率高,可以在锁定范围内进行防止并发的内存运算。但是,基于Redis技术的Redisson分布式锁在使用过程中主要存在以下两个方面的缺陷:
1.业务流程存在多次更新和复杂内存运算的时候,需要锁定整个业务流程,锁定时间长,过期时间不好确定。
2.Redisson分布式锁一般是锁定唯一的元素,而在网贷的还款分配、逾期分配和转让债权三个业务流程并发控制中,这种简单的分布式锁就不能实现对其并发的控制。
基于上述问题,使得简单的分布式锁不能实现网贷的该类业务场景。如图1所示,借款申请和债权数据是一对多的关系。一个借款申请下会有多个债权数据。
如图2所示,虽然还款分配、逾期分配和转让债权最终操作的都是债权数据,但还款分配和逾期分配业务流程基于借款申请,复杂运算后会更新借款申请下所有的债权数据。
如图3所示,转让债权业务流程基于债权数据,业务运算后会更新转出债权数据,并生成新的转入债权数据。
因此,根据上面两类业务流程图可以看出,还款分配和逾期分配业务操作借款申请下所有的债权数据,对于同一个借款申请ID是不能并发的。而转让债权是对借款申请下的单个债权数据进行操作,转出债权不仅会发生变化,还会生成新的转入债权,所以转让债权业务与还款分配、逾期分配也是不能并发的。对以上三个业务如果采用唯一元素的锁就会产生以下问题:
1.锁定单个债权。这样操作会造成还款、逾期分配业务发生之前,要锁定借款申请下所有债权(举例:借款申请金额为20万,最小投标金额为100元,则该借款申请下最多债权数量为200000/100=2000个),债权数量越多操作次数越多,不仅对Redis压力很大,而且一个失败将全部失败。
2.锁定整个借款申请。这样做不仅对还款分配和逾期分配整个业务流程都要进行加锁,从而导致锁定时间太长,而且还会导致在转让债权业务中,如果一个债权数据进行转让,则该债权数据所属借款申请下的其他债权数据不能进行转让,从而大大限制了业务开展的效率。
综上所述,现有的互联网贷款平台存在数据处理效率低、容易发生宕机的技术问题,仍存在需要改进的空间。
发明内容
为了解决上述互联网贷款平台数据处理效率低、容易发生宕机的问题,本发明提供了一种网贷业务数据处理方法,该方法使用Redis的Hashes数据结构(rmap),将借款申请ID(applyId)、业务类型和债权申请ID(loanId)存储起来,通过程序中运算和判断来决定是否可以获得锁,在还款分配、逾期分配和转让债权的业务流程开始调用加锁方法,业务流程结束的时候调用解锁方法,该方法实现分布式锁不需要锁定整个业务流程,只需要在Redis的Hashes数据结构的运算前后进行锁定,锁定时间大大减少,从而解决了业务并发问题。
为实现上述目的,本发明提供了一种网贷业务数据处理方法,包括:
对Redis的Hashes数据结构(rmap)进行加锁运算操作;
进入网贷业务处理流程;
对Redis的Hashes数据结构(rmap)进行解锁运算操作。
可选地,该方法还包括定义Redis的Hashes数据结构(rmap),包括设置映射表的关键值(key)、字段名(field)和字段值(value)。
可选地,所述关键值(key)采用借款申请ID(applyId)表示。
可选地,所述映射表包括业务类型固定值和债权ID(loanId)。
可选地,所述业务类型固定值用于表示所述网贷的业务类型,其中所述业务类型包括还款分配、逾期分配或转让债权中的至少一种。
可选地,所述加锁运算操作包括以下步骤:
基于所述借款申请ID(applyId)获取Redisson分布式锁;
根据关键值(key)和/或借款申请ID(applyId),获取Redis的Hashes数据结构(rmap)的数据;
若数据为空,将业务类型存储至Redis的Hashes数据结构(rmap);
若数据不为空,在Redis的Hashes数据结构(rmap)获取业务类型;
判断业务类型是否相同,若相同,根据业务类型进行运算;若不相同,加锁结果置为失败;
基于借款申请ID(applyId)释放Redisson分布式锁。
可选地,所述解锁运算操作包括以下步骤:
基于借款申请ID(applyId)获取Redisson分布式锁;
根据关键值(key)和/或借款申请ID(applyId),获取Redis的Hashes数据结构(rmap)的数据;
若数据为空,解锁结果置为成功;
若数据不为空,在Redis的Hashes数据结构(rmap)获取业务类型;
判断业务类型是否相同,若相同,根据业务类型进行运算;若不相同,解锁结果置为失败;
基于借款申请ID(applyId)释放Redisson分布式锁。
可选地,判断业务类型相同,根据业务类型进行运算时,基于所述借款申请ID的多个还款分配或逾期分配业务数据,加锁结果置为失败或清空所述Redis的Hashes数据结构(rmap)的数据;基于所述借款申请ID和不同债权ID的多个转让债权业务数据,加锁结果置为成功或判断是否清空所述Redis的Hashes数据结构(rmap)的数据。
可选地,还包括:判断当前业务类型与所述映射表中的业务类型是否均为转让债权类型,若是,进一步检验所述映射表中是否包含所述债权ID,若包含所述债权ID(loadId),则加锁结果置为失败或删除所述债权ID并判断是否清空所述Redis的Hashes数据结构(rmap)的数据;若不包含所述债权ID,则插入所述债权ID并将加锁结果置为成功或判断是否清空所述Redis的Hashes数据结构(rmap)的数据。
此外,本发明还提供了一种电子设备,包括:
存储器,用于存储计算机程序;
处理器,用于执行所述存储器中存储的计算机程序,且所述计算机程序被执行时,实现前述网贷业务数据处理方法。
此外,本发明还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时,实现前述网贷业务数据处理方法。
其中,本发明的相关术语如下:
(1)还款分配:借款人归还所欠的债款或偿付所欠的贷款。偿还全部或部分金额,将偿还的金额中的本金、利息、违约金等按照一定算法分配给出借人,并更新债权相应的本金、利息、违约金等信息。
(2)逾期分配:超过规定的期限,没有偿还应该兑付的金额。当借款人发生逾期时,将违约金按照一定算法分配给出借人,并更新债权相应的违约金信息。
(3)转让债权:是指合同债权人将其债权全部或者部分转让给第三人的行为。债权转让分为全部转让和部分转让。债权全部让与第三人,第三人取代原债权人成为原合同关系的新的债权人,原合同债权人因合同转让而丧失合同债权人权利,债权部分让与第三人,第三人成为合同债权人加入到原合同关系之中,成为新的债权人,合同中的债权关系由一人变数人或由数人变更多人。新加入合同的债权人与原债权人共同分享债权,并共享连带债权。出借人将自己持有的债权转出,由另外一名出借人购买转入,通过复杂的业务和价格计算,更新转出的债权相关价值,并生成转入的新债权。
(4)借款申请ID(applyId):表示借款人申请借款信息的唯一ID。
(5)债权ID(loanId):表示债权信息的唯一ID。
(6)业务类型(businessEnum):业务类型枚举,包含还款分配、逾期分配和转让债权。
(7)获取锁等待时间(waitTime):防止获取分布式锁时间过长,超过等待时间则失败。
(8)Redis:是一种开源的(BSD协议)内存数据库,可以作为缓存、消息系统、分布式队列等使用,支持多种数据结构,如字符串、hash表、列表、集合、范围查询的有序集合、位图等。
(9)Redis的Hashes数据结构(rmap):存储并发判断逻辑的数据结构。
(10)借款申请ID锁和Redis内Hashes数据结构失效时间(leaseTime):防止程序异常导致清除借款申请ID锁和Redis内Hashes数据结构失败,如果超过时效时间,则自动解锁借款申请ID锁和清除Redis内该Hashes数据结构的数据。
本发明的优点和有益效果如下:
1.结合Redisson分布式锁和Redis的Hashes数据结构(rmap),经过巧妙运算,彻底解决网贷业务中还款分配、逾期分配和转让债权不能并发的问题。
2.分布式锁不需要锁定整个业务流程,只需要在Redis的Hashes数据结构(rmap)的运算前后进行锁定,锁定时间大大减少。
3.相比单一的分布式锁,避免了大量操作Redis,解决了一笔失败全部失败的问题。
4.相比单一的分布式锁,不仅解决了还款分配、逾期分配和转让债权业务并发问题,还解决了同一个借款申请下的不同债权不能同时进行转让债权业务的问题。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例的部分介绍,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1示意性示出了现有技术的网贷业务数据库中借款申请和债权数据的关系示意图。
图2示意性示出了现有技术的还款业务和逾期分配业务的流程示意图。
图3示意性示出了现有技术的转让债权业务的流程示意图。
图4示意性示出了本发明一实施例的网贷业务数据处理方法的流程示意图。
图5示意性示出了本发明一实施例的网贷业务数据处理方法的数据结构示意图。
图6示意性示出了本发明一实施例的网贷业务数据处理方法的加锁操作的流程示意图。
图7示意性示出了本发明一实施例的网贷业务数据处理方法的解锁操作的流程示意图。
图8示意性示出了本发明一实施例的网贷业务数据处理方法的还款分配和还款分配业务加锁的流程示意图。
图9示意性示出了本发明一实施例的网贷业务数据处理方法的还款分配和还款分配业务解锁的流程示意图。
图10示意性示出了本发明一实施例的网贷业务数据处理方法的转让债权和转让债权业务加锁的流程示意图。
图11示意性示出了本发明一实施例的网贷业务数据处理方法的转让债权和转让债权业务解锁的流程示意图。
图12示意性示出了本发明一实施例的网贷业务数据处理方法的转让债权和还款分配业务加锁的流程示意图。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步描述。以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本发明的保护范围。
本发明的网贷业务数据处理方法,使用Redis的Hashes数据结构(rmap)实现网贷业务处理,需要在业务流程开始时进行判断是否可以获取锁,并进行Redis的Hashes数据结构(rmap)加锁运算操作,从而决定该业务是否可以进入业务处理流程。在业务处理流程结束时,进行Redis的Hashes数据结构(rmap)数据删除的解锁运算操作。由于Redis的Hashes数据结构(rmap)运算时间很短,这样可以避免锁定整个业务流程。
如图4所示,本发明的一实施例提供了一种网贷业务数据处理方法,包括:
对Redis的Hashes数据结构(rmap)进行加锁运算操作;
进入网贷业务处理流程;
对Redis的Hashes数据结构(rmap)进行解锁运算操作。
可选地,如图5所示,该方法还包括定义Redis的Hashes数据结构(rmap),包括设置映射表的关键值(key)、字段名(field)、字段值(value)。上述定义的映射表是一个string类型的映射表,其中的字段名(field)和字段值(value)一一对应设置,映射表也即rmap集合。
可选地,所述关键值key采用借款申请ID(applyId)表示。所述关键值key为唯一固定值,是为了保证在Redis中,一个借款申请ID(applyId)只有一份Hashes数据。
可选地,所述映射表包括业务类型固定值和债权ID(loanId)。保存当前正在执行的债权转让业务的债权ID,可以解决同一借款申请下不同债权不能同时进行转让债权业务的问题。
在映射表中,只有一份业务类型数据。可选地,所述业务类型固定值用于表示所述网贷的业务类型,其中所述业务类型包括还款分配、逾期分配或转让债权中的至少一种。根据业务类型固定值来获取该业务类型。优选地,业务类型共有三种,分别是还款分配、逾期分配和转让债权。
基于上述Redis的Hashes数据结构(rmap),通过运算决定是否可以加锁操作时,为了避免并发,在运算开始前,使用Redisson分布式锁技术获取借款申请ID(applyId),在运算结束后,将借款申请ID(applyId)进行解锁。
为了防止网络或其他问题的发生,可选地,定义Redis的Hashes数据结构(rmap)还包括设置等待时间(waitTime)和/或失效时间(leaseTime),获取Redisson分布式锁的处理时间达到等待时间(waitTime)时,获取Redisson分布式锁失败;和/或达到失效时间(leaseTime)时,自动释放所述Redisson分布式锁。设置“等待时间(waitTime)”是为了确保获取Redisson分布式锁的时间不会超过“等待时间(waitTime)”;设置“失效时间(leaseTime)”,是为了防止程序异常导致解锁时清除该Hashes数据结构失败,故设置达到“失效时间(leaseTime)”之后,所述Redisson分布式锁将自动释放。其中,leaseTime的值一般设置成远大于还款分配、逾期分配和转让债权三种业务执行时间的最大值。
可选地,如图6所示,所述加锁运算操作包括以下步骤:
基于所述借款申请ID(applyId)获取Redisson分布式锁;
根据关键值key和/或借款申请ID(applyId),获取Redis的Hashes数据结构(rmap)的数据;
若数据为空,说明此时无业务在处理,将业务类型存储至Redis的Hashes数据结构(rmap)。可选地,判断rmap中的业务类型(businessEnum)是否为转让债权,若请求处理的业务为转让债权,还需将转让债权ID(loanId)插入到映射表进行存储,将加锁结果置为成功;若rmap中的业务类型(businessEnum)为还款分配或逾期分配业务时,直接将加锁结果置为成功,表示请求处理的业务可以进入网贷业务处理流程。
若映射表中的数据不为空,说明此时有业务正在处理,在Redis的Hashes数据结构(rmap)获取业务类型。
若映射表中的业务类型(businessEnum)为空,说明此时为异常情况,直接将加锁结果置为失败。这是因为在正常情况下,映射表中的数据应包括业务类型数据。
判断业务类型不为空时,进行下一步处理:
判断业务类型是否相同,若相同,根据业务类型进行运算;若不相同,加锁结果置为失败。即,只有在基于同一借款申请ID的业务均为转让债权业务时,仅针对该借款申请ID所对应N个债权ID的其中一个进行处理,不同债权ID数据处理之间不会造成数据影响,所以才可能允许数据并发。然而,还款分配和逾期分配都是对同一借款申请ID的整体业务进行处理,会改变该业务的数据,所以不允许不同类型的业务之间、两个还款分配业务之间、两个逾期分配业务之间的数据并发处理。
可选地,对相同业务类型,根据业务类型进行运算时,基于所述借款申请ID的多个还款分配或逾期分配业务数据,由于还款分配和逾期分配业务都是基于借款申请ID的整体业务进行处理,不允许数据并发,则需将加锁结果置为失败;基于所述借款申请ID和不同债权ID的多个转让债权业务数据,即业务类型都是转让债权业务时,允许不同债权ID的转让债权业务并发,将加锁结果置为成功;基于所述借款申请ID的不同类型的业务,比如映射表中的业务为还款业务时,请求的逾期分配业务或转让债权业务将不被允许进入业务流程处理,不允许数据并发,也需将加锁结果置为失败。
可选地,判断当前业务类型与映射表中的业务类型是否均为转让债权类型,若是,进一步检验映射表中是否包含所述债权ID,若包含所述债权ID,则加锁结果置为失败;若不包含所述债权ID,则插入所述债权ID,并将加锁结果置为成功。
最后,基于借款申请ID(applyId)释放Redisson分布式锁。此时,允许请求的该借款申请ID(applyId)业务进入业务流程处理。
业务流程处理结束时,进入解锁运算操作,将更新的数据进行清空。
可选地,所述解锁运算操作包括以下步骤:
基于借款申请ID(applyId)获取Redisson分布式锁;
根据关键值(key)和/或借款申请ID(applyId),获取Redis的Hashes数据结构(rmap)的数据;
若数据为空,说明此时没有基于借款申请ID的业务正在处理,判定无需释放锁,直接将解锁结果置为成功;
若数据不为空,说明有基于借款申请ID的业务正在执行,在Redis的Hashes数据结构(rmap)获取业务类型;
若映射表中的业务类型(businessEnum)为空,说明此时为异常情况,直接将解锁结果置为失败。这是因为在正常情况下,映射表中的数据应包括业务类型数据。
判断业务类型不为空时,进行下一步处理:
判断业务类型是否相同,若相同,根据业务类型进行运算;若不相同,解锁结果置为失败。即,请求的借款申请ID的业务与映射表的业务类型不相同时,说明映射表中正在执行的业务不是需要解锁的业务,无需清除借款申请ID的映射表数据,解锁结果置为失败。
可选地,对相同业务类型,根据业务类型进行运算时,基于所述借款申请ID的多个还款分配或逾期分配业务数据,表示此时映射表中为请求解锁的还款分配或逾期分配业务,则清空所述Redis的Hashes数据结构(rmap)的数据,解锁结果置为失败;基于所述借款申请ID和不同债权ID的多个转让债权业务数据,根据rmap的大小(size)判断是否清空rmap数据,解锁结果置为成功。
可选地,判断映射表中的业务类型是否为债权转让类型,若是,进一步检验映射表是否包含所述债权ID(loadId),若包含所述债权ID,则删除所述债权ID,再根据rmap的大小(size)判断是否清空rmap数据;若不包含所述债权ID,则根据rmap的大小判断是否清空rmap数据。
进一步地,删除所述债权ID之后,若在映射表中不存在其他债权ID的转让债权业务正在执行时,即rmap的size小于等于1,清空rmap数据,解锁结果置为成功;若rmap的size大于1,说明还存在其他债权ID的转让债权业务正在执行,不需要清空该借款申请ID(applyId)的rmap数据,将解锁结果置为成功。
最后,基于借款申请ID(applyId)释放Redisson分布式锁。
在一实施例中,该方法实现还款分配和还款分配业务出现并发时的处理。如果当前正要执行的业务为还款分配,且Redis的Hashes数据结构(rmap)中业务类型也是还款分配,会进行如下运算:
如图8所示,进入加锁运算操作流程为:
首先对请求的借款申请ID(applyId)获取Redisson分布式锁,获得锁后通过关键值key(唯一固定值+借款申请ID(applyId))获取Redis的Hashes数据结构(rmap)的数据。
如果为空,则说明当前借款申请ID(applyId)没有进行还款分配业务,将还款分配业务类型存储至Redis的Hashes数据结构(rmap)中即可。
如果不为空,则说明当前借款申请ID(applyId)正在执行还款分配业务,业务冲突,加锁结果置为失败,所以不能进入业务流程。
Redis的Hashes数据结构(rmap)的数据运算后,基于借款申请ID(applyId)释放Redisson分布式锁。
如图9所示,进入解锁运算操作流程:
首先对请求的借款申请ID(applyId)获取Redisson分布式锁,获得锁后通过关键值key(唯一固定值+借款申请ID(applyId))获取Redis的Hashes数据结构(rmap)的数据。
如果为空,则说明当前借款申请ID(applyId)没有进行还款分配业务,不需要解锁,将解锁结果直接置为成功。
如果不为空,则说明当前借款申请ID(applyId)正在执行的还款分配业务为请求需要清空的业务数据,可以将Redis的Hashes数据结构(rmap)的数据清空。
Redis的Hashes数据结构(rmap)的数据运算后,基于借款申请ID(applyId)释放Redisson分布式锁。
在一实施例中,该方法实现还款分配和逾期分配业务出现并发时的处理。如果当前正要执行的业务为还款分配,而Redis的Hashes数据结构(rmap)中业务类型是逾期分配,由于还款分配和逾期分配都是对借款申请进行操作,所以同一个借款申请ID(applyId)在还款分配和逾期分配业务不能并发。还款分配业务进行解锁时,Redis的Hashes数据结构(rmap)中的业务类型(businessEnum)只能为还款分配,才能成功解锁。Redis的Hashes数据结构(rmap)的数据运算流程与图4相同。该实施例的加锁流程、解锁流程分别与图8和图9所示的相同。
在一实施例中,该方法实现还款分配和转让债权业务出现并发时的处理。如果当前正要执行的业务为还款分配,而Redis的Hashes数据结构(rmap)中的业务类型是转让债权,虽然还款分配和转让债权是分别对借款申请和债权进行操作,但也不能并发操作。Redis的Hashes数据结构(rmap)的数据运算流程与图4相同。由于Redis的Hashes数据结构(rmap)中的业务类型是转让债权,则rmap中还会存在当前正在执行的债权ID(loanId),其加锁流程与图8所示的相同。还款分配业务进行解锁时,Redis的Hashes数据结构(rmap)中的业务类型(businessEnum)只能为还款分配,才能成功解锁,其解锁流程与图9所示的相同。
在一实施例中,该方法实现逾期分配和逾期分配业务出现并发时的处理。如果当前正要执行的业务为逾期分配,而Redis的Hashes数据结构(rmap)中业务类型是逾期分配,则不能并发,Redis的Hashes数据结构(rmap)的数据运算流程与图4相同。逾期分配业务进行解锁时,Redis的Hashes数据结构(rmap)中的业务类型(businessEnum)只能为逾期分配,才能成功解锁。该实施例的加锁流程、解锁流程分别与图8和图9所示的相同。
在一实施例中,该方法实现逾期分配和转让债权业务出现并发时的处理。如果当前正要执行的业务为逾期分配,而Redis的Hashes数据结构(rmap)中的业务类型是转让债权,虽然逾期分配和转让债权是分别对借款申请和债权进行操作,但也不能并发操作。Redis的Hashes数据结构(rmap)的数据运算流程与图4相同。由于Redis的Hashes数据结构(rmap)中的业务类型是转让债权,则rmap中还会存在当前正在执行的债权ID(loanId),其加锁流程与图8所示的相同。逾期分配业务进行解锁时,Redis的Hashes数据结构(rmap)中的业务类型(businessEnum)只能为逾期分配,才能成功解锁,其解锁流程与图9所示的相同。
在一实施例中,该方法实现转让债权和转让债权业务出现并发时的处理。如果当前正要执行的业务为转让债权,且Redis的Hashes数据结构(rmap)中业务类型也是转让债权,会进行如下运算。
如图10所示,加锁流程如下:
首先对请求的借款申请ID(applyId)获取Redisson分布式锁,获得锁后通过key(唯一固定值+借款申请ID(applyId))获取Redis的Hashes数据结构(rmap)的数据。
如果为空,则说明当前借款申请ID(applyId)没有进行转让债权业务,将转让债权业务类型和当前执行转让债权业务的债权ID(loanId)存储至Redis的Hashes数据结构(rmap)中即可。
如果不为空,则说明当前借款申请ID(applyId)正在执行转让债权业务,检验要执行转让债权业务的债权ID(loanId)是否存在于Redis的Hashes数据结构(rmap)中,若存在,则无需处理,加锁结果置为失败;若不存在,则说明该借款申请ID(applyId)下有其他债权正在进行转让债权业务,可以并发执行业务,将债权ID(loanId)存储至Redis的Hashes数据结构(rmap)中,加锁结果置为成功。Redis的Hashes数据结构(rmap)的数据进行运算后,基于借款申请ID(applyId)释放Redisson分布式锁。
如图11所示,转让债权业务进行解锁时,Redis的Hashes数据结构(rmap)中的业务类型(businessEnum)只能为转让债权业务,才能解锁成功。解锁流程如下:
首先对请求的借款申请ID(applyId)获取Redisson分布式锁,获得锁后通过key(唯一固定值+借款申请ID(applyId))获取Redis的Hashes数据结构(rmap)的数据。
如果为空,则说明当前借款申请ID(applyId)没有进行转让债权业务,不需要解锁,将解锁结果直接置为成功。
如果不为空,则说明当前借款申请ID(applyId)正在执行转让债权业务,检验要执行转让债权业务的债权ID(loanId)是否存在于Redis的Hashes数据结构(rmap)中,若存在,则在Redis的Hashes数据结构(rmap)中删除债权ID(loanId)。
然后,检查Redis的Hashes数据结构(rmap)中是否只存在业务类型(businessEnum)即rmap的大小(size)等于1,若是,则说明没有其他债权ID的转让债权业务执行,清空Redis的Hashes数据结构(rmap),将解锁结果置为成功;若rmap中还存在其他债权ID即rmap的大小(size)大于1,则说明还有其他债权ID的转让债权业务正在执行,将解锁结果置为成功。
Redis的Hashes数据结构(rmap)的数据进行运算后,基于借款申请ID(applyId)释放Redisson分布式锁。
在一实施例中,该方法实现转让债权和还款分配业务出现并发时的处理。如果当前正要执行的业务为转让债权,而Redis的Hashes数据结构(rmap)中业务类型是还款分配,则不能并发,Redis的Hashes数据结构(rmap)的数据运算流程与图4相同。
如图12所示,在Redis的Hashes数据结构(rmap)的数据为空时,不仅要存储业务类型(businessEnum),还要存储债权ID(loanId)。
转让债权业务进行解锁时,Redis的Hashes数据结构(rmap)中的业务类型(businessEnum)只能为转让债权,才能成功解锁,其解锁流程与图11所示流程相同。
在一实施例中,该方法实现转让债权和逾期分配业务出现并发时的处理。如果当前正要执行的业务为转让债权,而Redis的Hashes数据结构(rmap)中业务类型是逾期分配,则不能并发,Redis的Hashes数据结构(rmap)的数据运算流程与图4相同。
加锁流程如图12所示,图12为转让债权和还款分配业务加锁的流程示意图。在Redis的Hashes数据结构(rmap)的数据为空时,不仅要存储业务类型(businessEnum),还要存储债权ID(loanId)。
转让债权业务进行解锁时,Redis的Hashes数据结构(rmap)中的业务类型(businessEnum)只能为转让债权,才能成功解锁,其解锁流程与图11所示流程相同。
此外,本发明还提供了一种电子设备,包括:
存储器,用于存储计算机程序;
处理器,用于执行所述存储器中存储的计算机程序,且所述计算机程序被执行时,实现前述网贷业务数据处理方法,该方法至少包括如下步骤:
对Redis的Hashes数据结构(rmap)进行加锁运算操作;
进入网贷业务处理流程;
对Redis的Hashes数据结构(rmap)进行解锁运算操作。
可选地,所述电子设备可为服务器、个人计算机或其他带有处理器的设备。
此外,本发明还提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时,能够实现前述网贷业务数据处理方法。该方法至少包括如下步骤:
对Redis的Hashes数据结构(rmap)进行加锁运算操作;
进入网贷业务处理流程;
对Redis的Hashes数据结构(rmap)进行解锁运算操作。
进一步地,所述计算机可读存储介质可以是ROM、随机存取存储器(RAM)、CD-ROM、磁带、软盘和光数据存储设备等。
综上所述,本发明提供一种网贷业务数据处理方法,该方法使用Redis的Hashes数据结构实现网贷业务处理,不需要锁定整个业务流程,在还款分配、逾期分配和转让债权的业务流程开始时判断是否可以获取Redisson分布式锁,并调用Redis的Hashes数据结构(rmap)加锁操作;在业务流程结束时调用Redis的Hashes数据结构(rmap)数据删除的解锁操作,使得工作量大大降低,实现了运算和判断时间短、锁定时间短、效率高的技术效果。另外,该方法还实现了转让债权和转让债权在借款申请ID(applyId)相同和债权ID(loanId)不同的情况下的并发而其他场景均不能并发,解决了同一个借款申请下的不同债权不能同时进行转让债权业务的问题,极大地提升了业务效率。
此外,尽管在附图中以特定顺序描述了本发明方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
虽然已经参考上述具体实施方式描述了本发明的精神和原理,但是应该理解,本发明并不限于所公开的具体实施方式,对各方面的划分也不意味着这些方面中的特征不能组合以进行受益,这种划分仅是为了表述的方便。本发明旨在涵盖所附权利要求的精神和范围内所包括的各种修改和等同布置。
Claims (12)
1.一种网贷业务数据处理方法,其特征在于,包括:
对Redis的Hashes数据结构进行加锁运算操作;
进入网贷业务处理流程;
对Redis的Hashes数据结构进行解锁运算操作;
其中,所述加锁运算操作包括以下步骤:
基于借款申请ID获取Redisson分布式锁;
根据关键值和/或借款申请ID,获取Redis的Hashes数据结构的数据;若数据为空,将业务类型存储至Redis的Hashes数据结构;
若数据不为空,在Redis的Hashes数据结构获取业务类型;
判断业务类型是否相同,若相同,根据业务类型进行运算;若不相同,加锁结果置为失败;
基于借款申请ID释放Redisson分布式锁。
2.如权利要求1所述的方法,其特征在于,还包括:定义Redis的Hashes数据结构,包括设置映射表的关键值、字段名和字段值。
3.如权利要求2所述的方法,其特征在于,所述关键值采用借款申请ID表示。
4.如权利要求2所述的方法,其特征在于,所述映射表包括业务类型固定值和债权ID。
5.如权利要求4所述的方法,其特征在于,所述业务类型固定值用于表示所述网贷的业务类型,其中所述业务类型包括还款分配、逾期分配或转让债权中的至少一种。
6.如权利要求3所述的方法,其特征在于,所述解锁运算操作包括以下步骤:
基于借款申请ID获取Redisson分布式锁;
根据关键值和/或借款申请ID,获取Redis的Hashes数据结构的数据;若数据为空,解锁结果置为成功;
若数据不为空,在Redis的Hashes数据结构获取业务类型;
判断业务类型是否相同,若相同,根据业务类型进行运算;若不相同,解锁结果置为失败;
基于借款申请ID释放Redisson分布式锁。
7.如权利要求3所述的方法,其特征在于,在加锁运算操作过程中,对相同业务类型,根据业务类型进行运算时,基于所述借款申请ID的多个还款分配或逾期分配业务数据,加锁结果置为失败;基于所述借款申请ID和不同债权ID的多个转让债权业务数据,加锁结果置为成功。
8.如权利要求6所述的方法,其特征在于,在解锁运算操作过程中,对相同业务类型,根据业务类型进行运算时,基于所述借款申请ID的多个还款分配或逾期分配业务数据,清空所述Redis的Hashes数据结构的数据;基于所述借款申请ID和不同债权ID的多个转让债权业务数据,判断是否清空所述Redis的Hashes数据结构的数据。
9.如权利要求7所述的方法,其特征在于,在加锁运算操作过程中,还包括:判断当前业务类型与所述映射表中的业务类型是否均为转让债权类型,若是,进一步检验所述映射表中是否包含所述债权ID,若包含所述债权ID,则加锁结果置为失败;若不包含所述债权ID,则插入所述债权ID并将加锁结果置为成功。
10.如权利要求8所述的方法,其特征在于,在解锁运算操作过程中,还包括:判断当前业务类型与所述映射表中的业务类型是否均为转让债权类型,若是,进一步检验所述映射表中是否包含所述债权ID,若包含所述债权ID,则删除所述债权ID并判断是否清空所述Redis的Hashes数据结构的数据;若不包含所述债权ID,则判断是否清空所述Redis的Hashes数据结构的数据。
11.一种电子设备,包括:
存储器,用于存储计算机程序;
处理器,用于执行所述存储器中存储的计算机程序,且所述计算机程序被执行时,实现权利要求1-10中任意一项所述的方法。
12.一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时,实现权利要求1-10中任意一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810983953.2A CN109255701B (zh) | 2018-08-27 | 2018-08-27 | 一种网贷业务数据处理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810983953.2A CN109255701B (zh) | 2018-08-27 | 2018-08-27 | 一种网贷业务数据处理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109255701A CN109255701A (zh) | 2019-01-22 |
CN109255701B true CN109255701B (zh) | 2022-05-10 |
Family
ID=65050391
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810983953.2A Active CN109255701B (zh) | 2018-08-27 | 2018-08-27 | 一种网贷业务数据处理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109255701B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110162532B (zh) * | 2019-05-09 | 2021-06-04 | 中国银行股份有限公司 | 交易数据处理方法和设备 |
CN110196868A (zh) * | 2019-06-06 | 2019-09-03 | 四川新网银行股份有限公司 | 基于分布式的工单流程监控方法 |
CN110795604A (zh) * | 2019-10-29 | 2020-02-14 | 中国工商银行股份有限公司 | 生成交易流水号的方法、装置、计算设备和介质 |
CN110716948B (zh) * | 2019-12-12 | 2020-04-14 | 四川新网银行股份有限公司 | 一种基于数据定期处理的双锁控制方法及介质 |
CN113535762B (zh) * | 2021-07-14 | 2024-01-26 | 北京数码视讯支付技术有限公司 | 安全的账户代付方法和装置 |
CN114004610A (zh) * | 2021-10-29 | 2022-02-01 | 北京理房通支付科技有限公司 | 业务处理方法、装置以及电子设备、存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103886079A (zh) * | 2014-03-26 | 2014-06-25 | 北京京东尚科信息技术有限公司 | 一种数据处理方法和系统 |
CN108399107A (zh) * | 2018-03-22 | 2018-08-14 | 武汉斗鱼网络科技有限公司 | 分布式锁实现方法、装置及可读存储介质 |
-
2018
- 2018-08-27 CN CN201810983953.2A patent/CN109255701B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103886079A (zh) * | 2014-03-26 | 2014-06-25 | 北京京东尚科信息技术有限公司 | 一种数据处理方法和系统 |
CN108399107A (zh) * | 2018-03-22 | 2018-08-14 | 武汉斗鱼网络科技有限公司 | 分布式锁实现方法、装置及可读存储介质 |
Non-Patent Citations (1)
Title |
---|
《基于 Redis 的分布式锁的实现方案》;赖歆;《信息通信》;20161031(第166期);第83-84页 * |
Also Published As
Publication number | Publication date |
---|---|
CN109255701A (zh) | 2019-01-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109255701B (zh) | 一种网贷业务数据处理方法 | |
US9756469B2 (en) | System with multiple conditional commit databases | |
WO2018077073A1 (zh) | 分布式数据库系统、事务处理方法、锁服务器及存储介质 | |
CN111259083A (zh) | 分布式事务处理方法及装置 | |
US7725446B2 (en) | Commitment of transactions in a distributed system | |
US6961865B1 (en) | Techniques for resuming a transaction after an error | |
CN101089857B (zh) | 一种内存数据库事务管理方法及系统 | |
US5745747A (en) | Method and system of lock request management in a data processing system having multiple processes per transaction | |
CN111680050A (zh) | 一种联盟链数据的分片处理方法、设备和存储介质 | |
JPH06301581A (ja) | 過ち許容トランザクション指向データ処理 | |
CN104793988A (zh) | 跨数据库分布式事务的实现方法和装置 | |
JPH035846A (ja) | リモート・アプリケーシヨン実行方式 | |
US6061708A (en) | System and method for supporting mixed-phase transactions in an object-oriented environment | |
CN101350022B (zh) | 基于数据库逻辑锁的变更处理方法 | |
CN114253673A (zh) | 一种分布式系统的事务处理方法和事务处理装置 | |
CN107533474B (zh) | 一种事务处理方法及装置 | |
KR20080042881A (ko) | 트랜잭션 일치 및 문제 상태 | |
CN108762895B (zh) | 处理分布式事务的方法及装置 | |
Zhang et al. | GRIT: consistent distributed transactions across polyglot microservices with multiple databases | |
CN112559496B (zh) | 一种分布式数据库事务原子性实现方法及装置 | |
US20080162610A1 (en) | Database garbage collector | |
US7203670B2 (en) | Method and system for maintaining enhanced file availability | |
JP3844933B2 (ja) | データベースサーバ処理方法 | |
JP4311059B2 (ja) | トランザクション制御方法 | |
CN112035503A (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |