引言

用户画像系统中,我们经常用到BitMap这个数据结构。
假设,系统一共有10个用户

  • 90后的用户有2位,用户ID是0、1
  • 80后的用户有8位,用户ID分别是2、3、4、5、6、7、8、9

对于传统的关系型数据的存储如下

用户ID 标签类型 标签值
0 年龄区间 90后
1 年龄区间 90后
2 年龄区间 80后
9 年龄区间 80后
0 购买力

如果基于BitMap,我们可以这样存

  • “人群包”,代表具有这个标签值的用户集合。“人群包”用一个二进制存,每一位代表一个用户
  • 比如“80后”这个标签,所对应的人群是1111111100。1表示有这个标签,0表示没有这个标签
    • 第1位(从右往左数)是0,即代表,ID=0的用户没有“80后”这个标签
    • 第2位也是0,即代表,ID=1的用户没有“80后”这个标签
    • 第3-10位都是1,即代表,ID=2-9的用户有“80后”这个标签
  • 比如“90后”这个标签,所对应的人群是0000000011。1表示有这个标签,0表示没有这个标签
    • 因此,0000000011即代表0、1用户有“90后”这个标签,而2-9用户没有“90后”这个标签 | 标签类型 | 标签值 | 人群包(BitMap) | | —- | —- | —- | | 年龄区间 | 80后 | 1111111100 | | 年龄区间 | 90后 | 0000000011 |

优点:

  1. 实则为倒排表的方式,节省空间。最用UInt64,它表示范围从0到18446744073709551615的无符号整数,用来表示系统所有用户已足够

BitMap

BitMap,顾名思义是一个Bit的映射表。它实际上就是一个二进制值,我们为每一个bit位赋予一个物理意义,那么一个bit就对应了一个意义,此为“Map”的含义。

优点:

  1. 节省存储空间,