【摘要】
面对高并发账户记录查询问题,按照本文的介绍一步一步操作,就能有效提升性能。点击了解高并发账户记录查询
问题描述
高并发账户记录查询在银行、互联网企业、通信企业中广泛存在。例如:网上银行、手机银行、电商个人账户查询、互联网游戏账户等等。这类查询有三个共同点:
1、 数据总量非常大。用户数量本身就非常多,再加上多年的账户数据,数据量可以达到几千万甚至上亿条。
2、 访问人数众多。几百万甚至上千万人访问,属于高并发查询。
3、 不能让用户等待。手机、网页要达到秒级响应,否则严重影响用户体验。
下面以某银行账户活期明细查询为例,给出这类问题的解决办法。
某银行共一亿个活期账户,每个账户平均每月有7条数据,每年数据总量84亿条。每条数据中的机构字段,还要关联分支机构表(几千条)记录。在性能上,要求单台服务器支持一千个以上的查询,响应时间不能超过1秒。
有序行存
活期明细数据随着时间增长非常快,一年就有84亿条。如果放到内存中,需要大量内存空间,硬件投入成本太高,所以要放到硬盘上存储。分支机构表只有几千条数据,可以放在内存中存储。
在硬盘上存储,要考虑是行存还是列存。列存数据分块压缩,能减少遍历数据量。但由于账户查询是随机的,整块读取会有额外解压计算。而且每次取数都针对整个分块,复杂度较高,性能不如行存。因此,这个场景要选择行存存储,如下图:
图1:行存和列存
具体的实现可以采用Java、C++、SPL等高级语言。这里我们以代码量最少的SPL语言为例讲解。
A | |
1 | =connect("db").cursor(“select * from detail order by id") |
2 | =file("detailR.ctx") |
3 | =A2.create@r(ID,CORPID,AMT).append(B1) |
代码示例1
A1:连接生产数据库,用游标读取活期存款数据,按照账户id排序。
A2:建立本地组表文件。
A3:建立组表,并从数据库游标读取活期存款明细数据,写入文件。
其中,A3中的@r选项,就是建立行存文件。一年84亿条数据都导出,时间会比较长。但是这是一次性的工作,后续就只需要追加增量数据即可。增量数据的追加方法,后面会有介绍。如果按照账户排序会对生产数据库造成较大压力,可以导出之后基于文件排序。排序使用SPL的sortx函数