一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于redis记录热点账户金额的方法及装置与流程

2022-12-07 03:22:42 来源:中国专利 TAG:


1.本发明涉及互联网分布式微服务架构领域,提供了一种基于redis记录热点账户金额的方法及装置。


背景技术:

2.银行账户系统分为进件服务模块,交易服务模块、账户服务模块、对账服务模块。各服务之间采用dubbo rpc协议通信。
3.交易模块接收并校验记录各类交易,然后发到账户模块进行记账,如果同一时间的多个交易都涉及同一个账户,就会在账户模块同一时间对同一个账户金额进行并发变动,如果不加控制,依赖数据库表的version乐观锁,并发非常低。目前是对正在记账的账户加分布式锁,后面过来的账户请求要获得该账户的锁,才可以记账。没获得锁需要等待10s,10s后依然获得不到锁就报并发冲突。但对于热点账户并发性能依然不高,严重影响业务发展。一个高并发的热点账户记账方案急需出现。


技术实现要素:

4.本发明的目的在于解决支持热点账户记账高并发,高性能的问题。
5.为了实现上述目的本发明采用以下技术方案:
6.一种基于redis记录热点账户金额的方法,
7.包括用于记录账户金额的账户表balance_accts、用于记录账户交易明细的账户明细表balance_txns,包括以下步骤:
8.步骤1.1:交易模块接收到交易报文后,对交易报文先进行业务校验,交易报文校验通过后,根据交易报文记录交易记录,然后将交易的交易信息发往账户模块进行账户记账,交易信息包括收付款账号,金额。
9.步骤1.2:接步骤1.1,在账户模块根据账户类型判断是否是热点账户;
10.步骤1.3:接步骤1.2,账户类型不是热点账户,则使用分布式锁来排队,避免账户表balance_accts并发冲突,分布式锁超时时间10s,等待的交易记账请求等待10s,10s后没获得锁就返回记账失败结果到交易模块,交易失败,如果获得锁则操作账户表balance_accts对账户金额做对应的加减,并且新增账户明细表记录balance_txns,操作成功后返回记账成功结果到交易模块。
11.步骤1.4:接步骤1.2,账户类型是热点账户,根据账户去查redis中是否有该账户的金额key,如果有则将金额key取出来,对账户金额做对应的加减,并写回到redis中,如果redis中没有账户的金额key就根据当前从数据库的账户表balance_accts查出来的金额初始化到redis。
12.步骤1.5:接步骤1.4,在热点账户金额变动后的值存储到redis后,将账户的交易明细存在账户明细表balance_txns,账户明细表balance_txns包含一个标记字段is_counted,来标识热点账户是否已统计计算到账户表balance_accts中,热点账户is_
counted值为0,非热点账户is_counted值为1;
13.步骤2.1:接步骤1.5,后台会启动一个定时任务,从balance_txns表中按账户记录的明细时间顺序取出is_counted=0的数据,按账户按时间顺序累加到数据库表balance_accts,每一条账户明细累计后更改is_counted=1,此时热点账户数据库表balance_accts中的金额的更新;
14.步骤3.1:接步骤2.1,为检查账户表balance_accts中的金额是否和redis中的一致,在后台启动一个定时任务,每天凌晨跑一次,检查每个电子账簿redis中的金额和账户表balance_accts与balance_txns中is_counted=0的金额是否一致,如果不一致就发出告警短信,通知运管人员,运管人员可以通过后管以账户表balance_accts中 balance_txns中is_counted=o的金额重置redis中的金额。这样保证了redis和数据库金额的最终一致性。
15.本发明还提供了一种基于redis记录热点账户金额的装置,包括用于记录账户金额的账户表balance_accts、用于记录账户交易明细的账户明细表balance_txns,包括:
16.业务校验模块:交易模块接收到交易报文后,对交易报文先进行业务校验,交易报文校验通过后,根据交易报文记录交易记录,然后将交易的交易信息发往账户模块交易信息包括收款账户类型、付款账号、金额。
17.账户模块:根据账户类型判断是否是热点账户,如是不是热点账户,采用分布式锁对账户进行加锁,然后进行账户记账,记账结束,如是热点账户,则采用redis缓存进行记账,将交易明细插入到账户明细表记录balance_txns中;
18.定时任务模块:根据账户明细表记录balance_txns对热点账户的账户表balance_accts的金额进行更新。
19.账户模块实现包括以下步骤:
20.步骤2.1、账户类型不是热点账户,则使用分布式锁来排队,避免账户表balance_accts并发冲突,分布式锁超时时间ns,等待的交易记账请求等待ns,ns后没获得锁就返回记账失败结果到交易模块,交易失败,如果获得锁则操作账户表balance_accts对账户金额做对应的加减,并且新增账户明细表记录balance_txns,操作成功后返回记账成功结果到交易模块,ns取值为10s,即10秒;
21.步骤2.2、账户类型是热点账户,根据账户去查redis中是否有该账户的金额key,如果有则将金额key取出来,对账户金额做对应的加减,并写回到redis中,如果redis中没有账户的金额key就根据当前从数据库的账户表balance_accts查出来的金额初始化到redis;
22.步骤2.3、接步骤2.2,在热点账户金额变动后的值存储到redis后,将账户的交易明细存在账户明细表balance_txns,账户明细表balance_txns包含一个标记字段is_counted,来标识热点账户是否已统计计算到账户表balance_accts中,热点账户is_counted值为0,非热点账户is_counted值为1。
23.定时任务模块:在后台启动一个定时任务,从balance_txns表中按账户记录的明细时间顺序取出is_counted=o的数据,按账户按时间顺序累加到数据库表balance_accts,每一条账户明细累计后更改is_counted=1,此时热点账户数据库表balance_accts中的金额的更新。
24.还包括容错模块,为检查账户表balance_accts中的金额是否和redis中的一致,在后台启动一个定时任务,每天凌晨跑一次,检查每个电子账簿redis中的金额和账户表balance_accts与balance_txns中is_counted=0的金额是否一致,如果不一致就发出告警短信,通知运管人员,运管人员可以通过后管以账户表balance_accts中 balance_txns中is_counted=0的金额重置redis中的金额。这样保证了redis和数据库金额的最终一致性。
25.因为本发明采用上述技术方案,因此具备以下有益效果:
26.本发明基于redis缓存,显著提高了交易的性能。提高系统并发能力,提高接口响应时间。提高支付业务平台的处理能力。
27.本发明基于定时任务的补偿机制,按照存储的账户明细表,对热点账户表按账户交易时间顺序将未计算的明细交易金额计算到账户表,使其按顺序串行执行,避免账户表的并发操作。
28.本发明基于定时任务的检查机制,及人工干预机制,保证了账户redis数据的正确性,保证了整个账户体系的稳定性。
附图说明
29.图1,热点账户走redis缓存记账逻辑。
30.图2,热点账户通过定时任务将账户金额补偿到账户表。
31.图3,热点账户通过定时任务检查redis缓存准确性。
具体实施方式
32.以下将对本发明的实施例给出详细的说明。尽管本发明将结合一些具体实施方式进行阐述和说明,但需要注意的是本发明并不仅仅只局限于这些实施方式。相反,对本发明进行的修改或者等同替换,均应涵盖在本发明的权利要求范围当中。
33.另外,为了更好的说明本发明,在下文的具体实施方式中给出了众多的具体细节。本领域技术人员将理解,没有这些具体细节,本发明同样可以实施。
34.本发明公开了一种基于redis记录热点账户金额的方法,
35.包括用于记录账户金额的账户表balance_accts、用于记录账户交易明细的账户明细表balance_txns,其特征在于,包括以下步骤:
36.步骤1.1:交易模块接收到交易报文后,对交易报文先进行业务校验,交易报文校验通过后,根据交易报文记录交易记录,然后将交易的交易信息发往账户模块进行账户记账,交易信息包括收付款账号,金额。
37.步骤1.2:接步骤1.1,在账户模块根据账户类型判断是否是热点账户;
38.步骤1.3:接步骤1.2,账户类型不是热点账户,则使用分布式锁来排队,避免账户表balance_accts并发冲突,分布式锁超时时间10s,等待的交易记账请求等待10s,10s后没获得锁就返回记账失败结果到交易模块,交易失败,如果获得锁则操作账户表balance_accts对账户金额做对应的加减,并且新增账户明细表记录balance_txns(is_counted=1),操作成功后返回记账成功结果到交易模块。
39.步骤1.4:接步骤1.2,账户类型是热点账户,根据账户去查redis中是否有该账户的金额key(key的格式balance:{平台id}:{账户}),如果有取出来,对账户金额(redis中账
户的金额value是哈希结构,哈希的key是固定值

settled’,

pending’,

expensing’,分别代表该账户的可提现金额,在途金额,不可用金额)做对应的加减,并写回到redis中。(上述redis操作都是在lua脚本中实现,lua脚本能保证一段redis操作的原子性)。,如果redis中没有账户的金额key就根据当前从数据库的账户表balance_accts查出来的金额初始化到redis。
40.步骤1.5:接步骤1.4,在热点账户金额变动后的值存储到redis后,将账户的交易明细存在账户明细表balance_txns,账户明细表balance_txns包含一个标记字段is_counted,来标识热点账户是否已统计计算到账户表balance_accts中,热点账户is_counted值为0,非热点账户is_counted值为1。可以看出此过程并发焦点的账户表balance_accts是没有数据库操作的,只有新增的balance_txns。避免了数据库表的并发冲突。(接口或后管查询页面账户金额,如果是热点账户走的都是redis)。操作成功后返回交易模块;
41.步骤2.1:接步骤1.5,后台会启动一个定时任务,每个5分钟运行一次。每次从balance_txns表中按账户记录的明细时间顺序取出is_counted=0的数据,按账户按时间顺序累加到数据库表balance_accts中(balance_acct.amount=balance_acct.amount balance_txn.amount),每一条账户明细累计后更改is_counted=1,此时热点账户数据库表balance_accts中的金额理论上就会和redis中一致;
42.步骤3.1:接步骤2.1,为检查账户表balance_accts中的金额是否和redis中的一致,在后台启动一个定时任务,每天凌晨跑一次,检查每个电子账簿redis中的金额和账户表balance_accts与balance_txns中is_counted=0(有可能比较时刚好有新交易,新交易账户明细还没被统计)的金额是否一致,如果不一致就发出告警短信,通知运管人员,运管人员可以通过后管以账户表balance_accts中 balance_txns中is_counted=0的金额重置redis中的金额。这样保证了redis和数据库金额的最终一致性。
43.本发明还提供了一种基于redis记录热点账户金额的装置,包括用于记录账户金额的账户表balance_accts、用于记录账户交易明细的账户明细表balance_txns,包括:
44.业务校验模块:交易模块接收到交易报文后,对交易报文先进行业务校验,交易报文校验通过后,根据交易报文记录交易记录,然后将交易的交易信息发往账户模块交易信息包括收款账户类型、付款账号、金额。
45.账户模块:根据账户类型判断是否是热点账户,如是不是热点账户,采用分布式锁对账户进行加锁,然后进行账户记账,记账结束,如是热点账户,则采用redis缓存进行记账,将交易明细插入到账户明细表记录balance_txns中;
46.定时任务模块:根据账户明细表记录balance_txns对热点账户的账户表balance_accts的金额进行更新。
47.账户模块实现包括以下步骤:
48.步骤2.1、账户类型不是热点账户,则使用分布式锁来排队,避免账户表balance_accts并发冲突,分布式锁超时时间ns,等待的交易记账请求等待ns,ns后没获得锁就返回记账失败结果到交易模块,交易失败,如果获得锁则操作账户表balance_accts对账户金额做对应的加减,并且新增账户明细表记录balance_txns,操作成功后返回记账成功结果到交易模块,ns取值为10s,即10秒;
49.步骤2.2、账户类型是热点账户,根据账户去查redis中是否有该账户的金额key,
如果有则将金额key取出来,对账户金额做对应的加减,并写回到redis中,如果redis中没有账户的金额key就根据当前从数据库的账户表balance_accts查出来的金额初始化到redis;
50.步骤2.3、接步骤2.2,在热点账户金额变动后的值存储到redis后,将账户的交易明细存在账户明细表balance_txns,账户明细表balance_txns包含一个标记字段is_counted,来标识热点账户是否已统计计算到账户表balance_accts中,热点账户is_counted值为0,非热点账户is_counted值为1。
51.定时任务模块:在后台启动一个定时任务,从balance_txns表中按账户记录的明细时间顺序取出is_counted=0的数据,按账户按时间顺序累加到数据库表balance_accts,每一条账户明细累计后更改is_counted=1,此时热点账户数据库表balance_accts中的金额的更新。
52.还包括容错模块,为检查账户表balance_accts中的金额是否和redis中的一致,在后台启动一个定时任务,每天凌晨跑一次,检查每个电子账簿redis中的金额和账户表balance_accts与balance_txns中is_counted=o的金额是否一致,如果不一致就发出告警短信,通知运管人员,运管人员可以通过后管以账户表balance_accts中 balance_txns中is_counted=o的金额重置redis中的金额。这样保证了redis和数据库金额的最终一致性。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献