RoaringBitmap位图
前言
Bitmap目前是一种比较常见的计数统计模型,Bitmap的数据结构是二进制类型的按位统计,每一位都有两种状态(0,1)。
举个例子:比如我们要使用Bitmap记录当前系统的在线人数,假设我们系统有1000个用户(包含在线和不在线的用户),那么我们设定状态0为不在线, 1为在线状态,每一位的顺序代表用户id,初始化Bitmap(1000位)
那么此时模型:000000000… (1000个0)
假设用户id为7的用户登录,那么我们的Bitmap的第7位设置成1代表用户id为7的用户是在线状态。
此时模型:000000100…
因为二进制的特性我们可以进行一些与或非运算以及将二进制转换成十进制。
比如
- 每周在线的人数统计,将本周每天的Bitmap进行 | 运算 1|1 = 1。
- 当前日活总数,将二进制转为十进制就是目 000000100… = 1(十进制)
Bitmap 常用场景
- 快速排序(计数排序)
- 快速去重
- 快速查询(如刚刚提到的在线人数查询等)
Bitmap缺陷
Bitmap是一种非常好的数据结构,但是也存在着空间浪费的问题,比如我系统的在线人数是1,整个系统有1000w用户,那么