一、描述
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
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、实现布隆过滤器