目录
一:概念
二:命令(先创建一个string类型的key)
1:设置某一位上的值
2:获取某一位上的值
3:返回指定值0或者1在指定区间上第一次出现的位置
4:位操作
5:统计指定位区间上值为1的个数
三:案例
1:网站用户的上线次数统计(活跃用户)
2:按天统计网站活跃用户
一:概念
位图不是真正的数据类型,它是定义在字符串类型中
一个字符串类型的值最多能存储512M字节的内容
位上限:2^(9+10+10+3)=2^32b
string转换成bit剩下的不是null而是0,在redis中0不是数据
二:命令(先创建一个string类型的key)
1:设置某一位上的值
SETBIT key offset value
offset偏移量,从0开始
value不写,默认是0
2:获取某一位上的值
GETBIT key offset
3:返回指定值0或者1在指定区间上第一次出现的位置
BITPOS key bit [start] [end]((指的是位)
例如:a 0110 0001获取 大于7的时候是0 用不用都在那里最大是512*1024*1024*8
b 0110 0001
ab 会是0110 0001 0110 0001
4:位操作
对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 dteskey 上
operation 可以是 AND(都为1才为1) 、 OR(有1则1) 、 NOT 、 XOR(都是0或者都为1才为1否则为0) 这四种操作中的任意一种
BITOP AND destkey key [key ...] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey
BITOP OR destkey key [key ...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey
BITOP XOR destkey key [key ...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey
BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey
除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入
当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0
空的 key 也被看作是包含 0 的字符串序列
a --> 01100001
b --> 01100010
and
BITOP and dest1 a b
a and b ---> 01100000
or
BITOP or dest2 a b
a or b --> 01100011
xor
BITOP xor dest2 a b
a or b --> 00000011
not
BITOP not dest4 a
a ---> 10011110
redis的数据再内存中,位运算效率极高
5:统计指定位区间上值为1的个数
BITCOUNT key [start] [end]区间不给默认是所有
从左向右从0开始,从右向左从-1开始,注意官方start、end是位,测试后是字节按照8位一个区间一个位图来进行计算
BITCOUNT testkey 0 0表示从索引为0个字节到索引为0个字节,就是第一个字节的统计
BITCOUNT testkey 0 -1等同于BITCOUNT testkey
最常用的就是 BITCOUNT testkey
三:案例
1:网站用户的上线次数统计(活跃用户)
分析:
用户ID为key,天作为offset,上线置为1
例如:ID为500的用户,今年的第1天上线、第30天上线 SETBIT u500 1 1 SETBIT u500 30 1
用:BITCOUNT u500 KYES u*
2:按天统计网站活跃用户
分析:
天作为key,用户ID为offset,上线置为1
例如:求一段时间内活跃用户数 SETBIT 20160602 15 1
SETBIT 20160601 123 1 SETBIT 20160606 123 1
求6月1日到6月10日的活跃用户
BITOP OR 20160601-10 20160601 20160602 20160603 20160610
BITCOUNT 20160601-10 结果为2