【Redis】Bitmap:基于String的位操作

200 阅读2分钟

 一、描述

Bitmap(位图),是一串连续的二进制数组。
Bitmap不属于Redis的基本数据类型,是基于String的位操作


二、长度

String的最大长度是 512M,所以Bitmap的offset上限是8bit * 1024byte * 1024kb * 512 = 2^32-1 Bit。

-1是存在分隔符。


三、命令

1、Setbit: 设置

setbit [key] [offset] [0/1]

2、获取

getbit [key] [offset]

由于是基于String类型,所以String的方法也可以用。

3、Getbit :统计bitmap中1的数量

bitcount [key]

统计bitmap中1的数量,限定范围。

start字节起始位置,end字节结束位置,一个字节8bit。

bitcount [key] [start] [end]

例:

bitcount [key] 0 1

统计key中范围0到15的数据。

4、Bitpos : 返回第一次出现的Bit(0 / 1)的下标,不存在则返回-1

bitpos [key] [bit]
bitpos [key] [bit] [start] [end]

例:

在24位置设置 1
setbit mykey 24 1

查询 1 第一次出现的位置
bitpos mykey 1         //返回24

查询 0 第一次出现的位置 bitpos mykey 0         //返回0

5、Bitop :逻辑运算 

bitop [and\or\xor] [resultKey] [key1 key2 ...]
bitop [not] [resultKey] [key]

And:逻辑与;
Or:逻辑或 ;
Xor:异或;
Not:逻辑非;
将运算的结果保持到resultKey

6、 Bitfield:指定位数操作

  • Set设置与Get获取

参数Type :
i :有符合整数;
u :无符号整数;

参数Offset :
无符号:表示n个bit位 ; 
# 符合:整数宽度的偏移量;

例: i8 表示 8位无符号整数

//设置Bit宽度为type n 的数据,会返回旧值
bitfield [key] set [type] [offset] [value]

//获取Bit宽度为type n 的数据
bitfield [key] get [type] [offset]

设置获取例子

// mykey设置前位图 [0,0,0,0,0,0,0,0,...]
bitfield mykey set i8 0 10

// mykey设置后位图 [0,0,0,0,1,0,1,0,...],10的二进制就是1010
// 获取,返回10
bitfield mykey get i8 0

  • incrby 自增

bitfield mykey incrby [type] [offset] [自增n]
例:增加2,比如原来是10, 自增后12
bitfield mykey incrby i8 0 2

  • overflow 溢出控制

bitfield mykey incrby [type] [offset] [自增n] overflow [wrap | sat | fail]

wrap :上溢最小值开始,下溢最大值开始;
sat :上溢保持最大值,下溢保持最小值;
fail :  溢出不执行,并返回空

bitfield mykey incrby i8 0 2 overflow sat


四、使用场景

1、用户签到

key :【年份 : 用户ID】
offset :天数

2、统计活跃用户(用户登陆情况)

key:日期
offset :用户ID(对ID有需求)

3、实现布隆过滤器

布隆过滤器原理