利用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

 

 

 

 

posted @ 2022-09-28 11:22  桃花雪  阅读(652)  评论(0编辑  收藏  举报