一句话介绍bitmap
只需消耗极小的存储空间,即可高效的满足大数据规模下的查询、统计、去重等使用场景。
bitmap的基本思想
我们假设数据只有两种状态,那么刚好就可以用1个bit位的0,1来分别表示,这样计算下来即使有1亿条这样的数据,那也只需要用到(100000000 / 8 / 1024 / 1024 ≈ 11.92MB),大约12M的空间。同样的条数,如果换到Java中常用的int数据类型来存储,则需要用到(100000000 * 4 / 1024 / 1024 ≈ 381.46MB),大约381M的空间,数据越多,32倍的差异就越明显。
真的有那么多只用两种状态就能描述的数据吗?
只有两种状态的数据的应用场景看起来比较局限,但其实已经能解决非常多的类似于是与非的日常问题了。
除此之外,虽然我们非常清楚客观世界并非是非黑即白的,但我们要想得到一种结果往往又会进行一定程度上的简化和分类,以此来支持我们的行动和决策。比如:统计用户日活,我们简单的归为当日登陆和当日未登陆。把复杂问题经过简化后的这类场景,看起来就又回到了是与非的问题了。
不适合bitmap的场景
- 如果数据状态比较多,无法用1个bit位来表示,自然就不适合使用bitmap。
- 数据不可重复既是优点也是缺点,优点在于不可重复性可以用来判断是否存在,从而满足某些业务场景。同样,不可重复则表示如果添加了一条已经存在的数据,则会忽略本次操作。
- 如果数据比较稀疏则可能会导致bitmap占用较大空间,因为每一条数据都会映射在bitmap中的某一个位点上,假设有两条数据分别是
0,99999,此时对于bitmap来说虽然只有两条数据,但依旧要申请99999个位的空间大小,才能满足这两条数据的存放。
基于bit的基本操作
在应用bitmap之前,有必要了解一下关于位运算的一些常见操作,见识一下只有0,1的数据是如何释放出巨大的运算能量的。
and运算
奇偶判断
x and 1可以用来取x二进制的最末位,常用来判断一个数的奇偶性,x and 1结果为0,则x为偶数,结果为1,则x为奇数。
if (x & 1 == 0) {
"偶数"
} else {
"奇数"
}
清零操作
x and (x + 1),把右边连续的1变成0。
x and (x - 1),把最后一个1变为0。
x and 0,所有位都改为0。
取末位
和奇偶判断一样,x and 1可以用来取x二进制的最末位,那么x and 11同样可以用来取x二进制的最后2位,x and 111可以用来取x二进制的最后3位,x and 1111可以用来取x二进制的最后4位,以此类推。
判断指定位是否为1
public static boolean 判断指定位是否为1(<

文章介绍了bitmap技术,如何通过1bit节省大量存储空间,适用于大数据场景下的查询、统计和去重。尽管数据通常需简化分类,但bitmap尤其适合是/非问题。文章还探讨了不适合使用bitmap的情况,并列举了基于bit的基本操作,以及在业务场景中的应用实例,如RedisBitmap在千万级用户签到中的应用。
最低0.47元/天 解锁文章
395

被折叠的 条评论
为什么被折叠?



