背景
位图(bitmap)是一种基于bit位数组的数据结构,在大数据场景下对于存储和计算效率均有奇效。
假如将10亿连续的用户ID存在int数组,需要10亿个32位int,占用存储3.72G左右,如果改用bit数组存储,每一个bit位表示一个用户ID,只需要10亿个bit,120M左右存储就够。
下图为表示用户是否登入属性的一个bitmap数据结构,存储的是0和1,其中1表示登入过,0表示没登入,数组的下标位置表示用户ID,例如下图用户ID为1、2、5的用户登入过系统,那么统计当天登入的UV用户数只需要计算1的个数即可。
如果要计算次日留存,7日、30日留存,可以对每一天登入用户状态存入bitmap结构,计算次日留存就是计算day1和day2的bitmap结构对应位的与运算(day1表示第一天,计算7日,30日原理类似),这样就把留存计算从传统数据库中的left join转化为bit位运算,在存储和计算效率上都有本质的提升。
利用bitmap位运算特性,可以实现与、或、非和异或计算,计算结果也是bitmap,通过统计1的个数就可以知道结果集个数。对于应用场景中的基数统计都可以考虑使用bitmap处理。
业界实践
美图的Naix
用户行为例如新增、活跃、留存、升级、回访,本质上都是计算用户行为的个数&