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

一 Bitmap 原理

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

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值