从 Bitmap 到布隆过滤器,再到高并发缓存设计策略!
海量整数中是否存在某个值--bitmap
在一个程序中,经常有让我们判断一个集合中是否存在某个数的case;大
多数情况下,只需要用map或是list这样简单的数据结构,如果使用的是高
级语言,还能乘上快车调用几个封装好的api,加几个if
else,两三行代码就可以在控制台看自己“完美”而又“健壮”的代码跑起来了
。
但是,事无完美,在高并发环境下,所有的case都会极端化,如果这是一
个十分庞大的集合(给这个庞大一个具体的值吧,一个亿),简单的一个h
ash
map,不考虑链表所需的指针内存空间,一亿个int类型的整数,就需要38
0多M(4byte × 10
^8),十亿的话就是4个G,不考虑性能,光算算这内存开销,即使现在满
地都是128G的服务器,也不好吃下这一壶。
bitmap则使用位数代表数的大小,bit中存储的0或者1来标识该整数是否
存在,具体模型如下:
这是一个能标识0-9的“bitmap”,其中4321这四个数存在
计算一下bitmap的内存开销,如果是1亿以内的数据查找,我们只需要1亿
个bit =
12MB左右的内存空间,就可以完成海量数据查找了,是不是极其诱人的一
个内存缩减,以下为Java实现的bitmap代码:
public class MyBitMap {
private byte[] bytes;