利用bitmap解决用户标签的统计需求
传统的用户标签统计方法,利用Mysql设计了如下的表结构,每一个维度的标签都对应着Mysql表的一列:
要想统计所有90后的程序员该怎么做呢?
用一条求交集的SQL语句即可:
Select count(distinct Name) as 用户数 from table whare age = '90后' and Occupation = '程序员' ;
要想统计所有使用苹果手机或者00后的用户总合该怎么做?
用一条求并集的SQL语句即可:
Select count(distinct Name) as 用户数 from table whare Phone = '苹果' or age = '00后' ;
随着标签增多,用户数增多,查询性能会下降的,多个用户群体做并集处理distinct,性能慢的不可想象
bitmap解决方案
Bitmap不仅方便查询,还可以去除掉重复的整型数。在Java里面,BitMap已经有对应实现的数据结构类java.util.BitSet,BitSet的底层使用的是long类型的数组来存储元素。
让每一个标签存储包含此标签的所有用户ID,每一个标签都是一个独立的Bitmap。
这样,实现用户的去重和查询统计,就变得一目了然:
然后通过bit的与或运算解决群体并集问题
bitmap相比hashset和hashmap节省内存,只需要他们的32分之一。bitmap一个id只需要1bit,hashset等需要32bit