营销系统黑名单优化:位图的应用解析 | 京东云技术团队
内容提要
通过引入位图优化,可以快速过滤黑名单,提升处理速度,优化黑名单过滤策略,提高营销系统效率和质量。
延伸解读
性能瓶颈的定位与优化路径
文章指出,营销系统处理30万客户群体时,过滤黑名单耗时近半小时,成为触达流程的主要瓶颈。优化从多线程入手,将账号集合拆分为子任务并行处理,使25万和50万账号的处理时间从半小时、一小时降至1-2分钟。这提示我们,对于I/O密集型任务,多线程能快速见效,但若想进一步突破,需从数据结构层面寻找更优解。
位图方案的核心优势与实现要点
位图利用bit标记数值存在性,存储高效且位操作极快。CDP中营销群体和黑名单均以位图存储,通过andNot操作可直接得到过滤后的目标群体位图。示例中50万群体的位图文件仅约2MB,过滤操作仅需80毫秒左右,相比多线程方案有数量级的提升。实现时需注意使用CDP SDK加载群体位图,并调用andNot方法。
位图选型:BitSet与RoaringBitmap的权衡
Java的BitSet实现简单,但稀疏数据下内存浪费严重,例如仅存储一个数值200000000就占用约23MB。RoaringBitmap通过高低位分桶和容器压缩,同样场景仅需144B,且性能常优于传统压缩位图。CDP人群位图基于Roaring64NavigableMap实现,适合大规模数据。选型时应根据数据分布和内存约束决定。
位图的适用边界与注意事项
位图适合大规模布尔值集合、去重、排序及存在性查询,但并非万能。位图索引适用于低基数列(如性别),高基数列或频繁更新场景会占用大量空间且更新成本高。Redis位图受字符串长度限制,数据量巨大时需考虑内存效率。布隆过滤器可处理字符串映射,但有误报率,适用于容忍误报的场合。
Q&A
营销系统黑名单过滤为什么需要优化?
因为客户投诉是业务发展的障碍,过滤黑名单高风险账号并配合频控策略可以减少客诉,提升营销效率和质量。但测试中发现,对于近30万的营销群体,整个触达流程需要处理一个多小时,其中过滤黑名单就占用了近半个小时,业务难以接受这个性能。
如何通过多线程优化黑名单过滤?
对于调用RPC接口这种含有I/O操作的场景,可以引入多线程优化,将一个几十万的账号集合拆分为多个子任务提交给线程池处理,从而加快处理速度。例如,单线程处理25万、50万个账号的群体分别需要近半小时、近一小时,改为25个线程处理后可以分别控制在1分钟、2分钟左右。
位图优化黑名单过滤的原理是什么?
CDP的群体都会有对应的位图文件,营销客户群体和黑名单群体都是以位图的数据结构存储的。通过CDP下载群体的SDK获取位图文件,将营销群体的位图与黑名单群体位图进行与非操作(andNot),得到的新位图就是过滤掉黑名单账号后的目标客户的位图。位图存储节省空间,与非操作非常快,25万、50万的群体都可以在80毫秒左右过滤掉黑名单账号。
位图的基本原理是什么?
位图的基本思想是使用bit来标记一个数值,1表示该数值存在,0表示不存在。由于以位为单位存储数据,因此可以大大节省存储空间。通过这种方式,可以非常高效地表示和操作数值集合。例如,40亿个不重复的随机自然数,如果使用long型数值存储,占用约29.8GB,但存储为40亿个bit,则只需要约0.47GB。
RoaringBitmap相比BitSet有什么优势?
BitSet会占用过多内存,如果只存储一个数值200000000,BitSet会占用约23MB内存,浪费严重。RoaringBitmap是一种压缩位图,性能往往优于WAH、EWAH或Concise等传统压缩位图,在某些情况下速度可以快上数百倍,压缩效果更好。如果使用RoaringBitmap只存储一个数值200000000,只需要144B的内存。
位图有哪些应用场景?
位图可以用较少的内存来表示大规模的布尔值集合,节省内存空间,并且支持高效的位操作,如AND、OR、XOR等,对于存在性查询,位图可以在常数时间内完成。一些面试题中出现的几十亿数据的去重、排序、计数或者成员查询等问题,都可以通过位图解决。此外,Java中的ArrayList使用位图优化removeIf方法,位图索引适合处理具有较少唯一值的列查询,Redis的位图适合处理大量布尔值数据,布隆过滤器用于快速判断元素是否在集合中。