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