Bitmap原理和实现及其在Redis的应用

一 Bitmap 原理

Bitmap 的基本原理就是用一个 bit 来标记某个元素对应的 Value,而 Key 即是该元素。由于采用一个bit 来存储一个数据,因此可以大大的节省空间。

比如我们需要将数据从 A 表迁移到 A1...A10 个表,我们可以使用 Bitmap 对 A 表中的数据进行标记,表示数据迁移状态。现在我们将 2,7,12,15 迁移到 A1...A10 表中,经过 BitMaps 标记后如下图所示:

二 Bitmap 代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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,说明没有标记过。