一 Bitmap 原理
Bitmap 的基本原理就是用一个 bit 来标记某个元素对应的 Value,而 Key 即是该元素。由于采用一个bit 来存储一个数据,因此可以大大的节省空间。
比如我们需要将数据从 A 表迁移到 A1...A10 个表,我们可以使用 Bitmap 对 A 表中的数据进行标记,表示数据迁移状态。现在我们将 2,7,12,15 迁移到 A1...A10 表中,经过 BitMaps 标记后如下图所示:
二 Bitmap 代码实现
public class BitMap {
/**
* 标记指定数字(num)在bitmap中的值
* 将1左移position后,那个位置自然就是1,然后和以前的数据做|,这样,那个位置就替换成1了
* @param bits
* @param num
*/
public void add(byte[] bits, int num){
bits[getIndex(num)] |= 1 << getPosition(num);
}
/**
* num%16得到在byte[index]的位置
* @param num
* @return
*/
public int getPosition(int num){
return num & 0x0f;
}
/**
* num/16得到byte[]的index
* @param num
* @return
*/
public int getIndex(int num){
return num >> 4;
}
}
三 Redis 中 Bitmaps 命令
在 Redis 中 Bitmaps 单独提供了一套命令,可以把 Bitmaps 想象成一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在 Bitmaps 中叫做偏移量。
1 设置值
setbit key offset value
将 2,7,12,15 标记成1,返回值是0,说明以前没有标记过这个数;最后设置2返回1,说明之前标记过2。
2 获取值
getbit key offset
获取2返回1,说明标记过;获取3返回0,说明没有标记过。