您可以通过云原生内存数据库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高性能,提供更低的延迟和更高的吞吐。
目标用户筛选流程
人群筛选类业务往往包括模型的生成和筛选等多个步骤。
用户特征的原始数据往往存储在关系型数据库中,通过行schema存储用户的不同维度特征。
按需对原始数据进行处理,生成用户UID到人群Tag信息的映射关系。
定时更新(导入)用户UID到标签信息的映射关系到TairRoaring引擎中(一般为T+1,表示业务的第二天导入前一天的数据)。
通过TairRoaring加速业务计算:
查询目标用户与人群Tag的关系。
例如,判断用户(user1)是否属于人群Tag-A (编号 16161)。
TR.GETBIT user1 16161
通过
AND
、OR
、DIFF
等操作构造逻辑人群,并对逻辑人群信息进行计算。例如,获取同时属于人群Tag-B和Tag-C的所有目标用户。
TR.BITOP result AND Tag-B Tag-C
也存在部分从Tag信息到用户UID映射关系的场景,如风险控制场景等。
例如,查询用户(user1)是否属于某个人群Tag-A中。
TR.GETBIT Tag-A user1