Redis是高性能的key-value数据库,支持5种基本类型(String, List, Set, ZSet, Hash)以及5种基本类型的扩展。对于Set数据类型,天然的支持交集、差集、并集等集合运算。
将预处理过的对账文件按轧帐标识和比对元素加载到Redis的一个Set A,本系统的交易记录也一并加载到Redis的另外一个Set B。Set A和Set B的交集即为对账对平的交易。
Set A-Set B差集并不是多的记录,还需要将每个元素和Set B-Set A的差集进行查找,如果有轧帐标识一样但比对元素不一样的,即为差错交易;如果没有轧帐标识一样的元素,才能判断是多的记录。同理,可以找出少的记录。
这种借助于Redis轧帐,是一种纯内存计算,预热快,速度快,充分利用Redis的成熟计算类型,没有复杂的程序逻辑处理,避免出错。但缺点是计算机内存有限,不能支持海量对账数据。
改进措施
按一定规则,进行数据分片,不同的数据按照轧账标识分片到不同的Redis,最后再进行汇总,但同时也增加了轧帐复杂性。
如果把轧帐进行数学模型抽象的话,可以抽象为一个典型的算法问题:构建2个无重复元素的集合,按照一定比对规则找出2个集合的差集、交集,对差集和交集的元素属性进行计算比对,找出差异性。
通过抽象后,我们可以看出,有很多实现方法,比如Java JDK提供的集合计算Collections、擅长搜索的Elastic Search等。
这种实现方式需要视具体情况进行分析,有些实现需要花大量的时间和逻辑在数据预热上,有些实现会导致汇总数据的逻辑复杂化。
总之,对账系统涉及公司的账务会计核心,尽早建立完备的对账系统,可以推动更加精细化掌握业务情况,特别是互联网金融公司。
在对账系统落地时,可以综合考虑本文提出的方案,找出适合公司业务发展的技术方案,尽量使用成熟技术解决业务问题,减少技术风险性。
本文的下半部分将讲述如何处理海量数据的对账,以及平帐/差错处理和虚拟账户对账,敬请期待。
作者介绍
王兴建
现任上海秦苍(买单侠)信息科技有限公司软件架构师,加入秦苍之前,曾在中国银联、证通任职。
专注于Java Core、NoSQL、分布式服务框架等技术领域,对移动支付、客户认证、红包、虚拟账户、信贷等业务领域有丰富的经验,擅长将成熟技术应用于业务。
目前主要负责秦苍运营商合作业务的架构设计,以及技术在业务中的落地工作。