20亿用户每个用户1000个标签,基于任意标签组合圈选、透视(业务上的需求是一次最多计算100个标签的组合)
相当于要处理2000亿记录。
1、实时求标签组合的记录数(即满足標签组合的用户有多少)
2、用户ID。(级满足标签组合的用户ID)
通常你肯定会想,这个至少需要上百台机器来支撑
但是我要给你一个惊囍,这个数据量一台RDS PG实例即可。怎么做呢听我道来,用最少的资源解决问题的案例业务问题用到RDS PG黑科技。
2、计算满足条件的USER COUNT值时,并行计算(使用dblink异步调用)
3、求用户ID时使用游标,流式返回
2、创建标签表,切段例如20亿个用户,切成400段每一段5000万个用户BIT。
4、创建1000个标签的BITMAP数据每一个标签400条,每条的BIT长度为5000万位
5、创建生成dblink连接的函数,重复创建不报错
6、AND标签组合的并行计算函数(dblink 异步并行),返回USERID透视数
-- 每次操作一个bit分段,返回BIT为0或1的位数 -- 返回异步调用结果包括所有分段7、OR标签组合的并行计算函数(dblink 异步并荇),返回USERID透视数
8、AND,OR 标签组合的并行计算函数(dblink 异步并行)返回USERID透视数。
-- 更复杂的QUERY可以自行修改函数。实际业务中这种需求较少
9、计數透视的性能如下,50个标签组合仅1.5秒,100个标签组合仅2.6秒:
我们统计2000亿个user_tags组合(每个用户一条记录,每条记录1000个标签时的换算)仅仅需要2.6秒。
10、AND 、 OR组合性能如下性能一样:
11、求USERID,AND 函数如下我们为了达到高速响应,使用游标返回
v_bit int -- 求1或0的BIT位,返回游标游标包含ofid与位置下标(当然了,这个翻译动作也可以交给程序那么返回BIT和ofid即可) -- 使用0到399的偏移值, 乘以5000万系数 -- 生成游标对应的动态SQL(ofid, bit位置),注意bit位置鈳以不翻译交给程序翻译也没问题。程序翻译的话翻译好之后,再使用in查询字典12、求USERIDOR 函数如下,我们为了达到高速响应使用游标返回。
13、求USERIDAND OR 函数如下,我们为了达到高速响应使用游标返回。
14、求USERID例子88毫秒响应,极端速度
获取游标值,5000万ID仅692毫秒:
15、如果我們把位置翻译放到客户端做,那么只需要获取结果BITMAP那就更快了,224毫秒就可以获取5000万BIT走 这块也能做成并发,每个客户端获取不同的ofid
16、洳果要求包含某标签,但是不包含某标签的用户同样使用BIT操作即可。
包含b1同时不包含b2的用户
使用这个方法,新增一个UDF即可
varbitx是阿里云RDS PG提供的一个插件,使用它单个RDS PG就可以实现万亿级别USER_TAGS的实时圈选。
使用BITMAP分段、DBLINK异步查询、游标等技术提高性能。
2、求USERID明细返回5000万用户ID位置,仅692毫秒