基于TairRoaring实现人群圈选方案

您可以通过Tair(企业版)的TairRoaring数据结构快速搭建高性能的目标用户筛选服务。

TairRoaring简介

用户标签筛选场景往往应用于个性化推荐、精准营销等具体业务场景,通过不同的标签辅以不同的运营营销,从而实现资源投放方的商业利益最大化。

该类业务通常具备如下特点:

  • 用户标签极多,需要较高的存储空间及良好的扩展能力。

  • 用户规模大,需按照众多维度添加标签,数据分布较为离散。

  • 计算量大,应用会根据不同策略需选取不同标签的用户,且对性能、实时性均有较高要求。

用户圈选

Bitmap(又名Bitset)数据结构可以较好地实现以上需求,使用少量的存储空间来实现海量数据的查询优化。Redis开源版支持Bitmap运算,但是原生Bitmap往往难以应付超大规模的人群打标问题:

  • 原生Bitmap受限于keyspace的大小,对于稀疏场景会出现空间效率急剧降低的情况。

  • 使用string进行Bitmap操作时,很多计算逻辑需要上载到用户代码逻辑中执行,一来一回增加了3次额外的RTT(Round-Trip Time,往返时延)。

  • 原生Redis存储Bitmap时极易产生大key,会对集群稳定性带来极大的挑战。

Roaring属于高度工程优化的Bitmap实现:

  • 通过2层索引和多种动态容器(Container),平衡了多种场景下性能和空间效率。

  • 使用了包括SIMD instructions、Vectorization、PopCnt算法等多种工程优化,提升了计算效率,实现了高效的时空效率。

  • 基于Tair提供的强大计算性能和极高的稳定性,为用户场景保驾护航。

相比较原生Bitmap,TairRoaring具有更低的内存占用、更高的集合计算效率,同时依托Tair高性能,提供更低的延迟和更高的吞吐。

目标用户筛选流程

人群筛选类业务往往包括模型的生成和筛选等多个步骤。

TairRoaring应用

  1. 用户特征的原始数据往往存储在关系型数据库中,通过行schema存储用户的不同维度特征。

  2. 按需对原始数据进行处理,生成用户UID到人群Tag信息的映射关系。

  3. 定时更新(导入)用户UID到标签信息的映射关系到TairRoaring引擎中(一般为T+1,表示业务的第二天导入前一天的数据)。

  4. 通过TairRoaring加速业务计算:

    • 查询目标用户与人群Tag的关系。

      例如,判断用户(user1)是否属于人群Tag-A (编号 16161)。

      TR.GETBIT user1 16161
    • 通过ANDORDIFF等操作构造逻辑人群,并对逻辑人群信息进行计算。

      例如,获取同时属于人群Tag-B和Tag-C的所有目标用户。

      TR.BITOP result AND Tag-B Tag-C
    • 也存在部分从Tag信息到用户UID映射关系的场景,如风险控制场景等。

      例如,查询用户(user1)是否属于某个人群Tag-A中。

      TR.GETBIT Tag-A user1