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

    技术2025-12-10  12

    一 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,说明没有标记过。

    Processed: 0.008, SQL: 9