当前位置: 首页 > 后端技术 > Java

巧妙使用RoaringBitMap处理海量数据内存diff问题

时间:2023-04-01 23:56:54 Java

背景目前在产品圈选场景中,每个tagid都会根据产品集合的规则/索引绑定一定量的数据,当圈选规则的条件发生变化或触发定时任务时,刷新商品集合时,将添加符合规则的新商品,不符合规则的商品将被删除。但是由于产品集下的SPU数量多在几十万,多的可达几百万,如果直接把刷新前后十万甚至几百万SPU的SPU全部放到内存中做相互进行diff,然后获取diff添加和删除差异集。当同时刷新的标签过多时,内存很容易溢出,导致整个服务宕机。同时,目前存储产品集的底层数据库是Hbase,所以在标签端,目前对产品集的刷新场景,即刷新后的产品集,采用全增全删的策略全量保存一次(利用Hbase的幂等存储,重复保存数据会覆盖同一个rowkey的数据,而不是在保存前判断是否存在额外数据),并更新数据的modity_time=now(),然后从Hbase中批量扫描商品集,找到modity_time