大数据面试题:redis部分 bit 操作?

(1)基本用法
位图不是真正的数据类型,它是定义在字符串类型中,一个字符串类型的值最多能存储512M 字节的内容,位上限:2^(9+10+10+3)=2^32b
(2)命令
设置某一位上的值
SETBIT key offset value 0/1 偏移量从 0 开始
获取某一位上的值
GETBIT key offset
返回指定值 0 或者 1 在指定区间上第一次出现的位置偏移量
BITPOS key bit [start 字节] [end 字节]
bitpos k1 1 1 1
k2: 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0
k3: 0 1 0 0 0 0 1 0
0 1 0 1 0 0 0 1 0 1 0 0 0 0 1 0
setbit k1 1 1
(3)位操作
0 1 0 0 0 0 0 1
1 1 1 0 0 0 0 1
0 1 0 0 0 0 0 1
对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种
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 的字符串序列
(4)应用场景
网站用户的上线次数统计(活跃用户)
用户 ID 为 key,天作为 offset,上线置为 1 366> 000000000000000
366 /8 50Byte 16 50
key: mike value: 11 1 000000000000000001010000000000000000
ID 为 500 的用户,今年的第 1 天上线、第 30 天上线
SETBIT u500 1 1 1 0 0 000 0 …….1 0 00 0 > 365 /8 46 Byte
SETBIT u500 30 1
BITCOUNT mike 0 -1
按天统计网站活跃用户
天作为 key,用户 ID 为 offset,上线置为 1
求一段时间内活跃用户数 500 / 8 366 * 63Byte
SETBIT 20180601 15 1 1 1 0 1 00 00 00 0 00 00 0
SETBIT 20180603 123 1 0 1 0 0 00 00 01 0 00 00 0
SETBIT 20180606 123 1 0 1 0 0 00 00 01 0 00 00 0
求 6 月 1 日到 6 月 10 日的活跃用户
BITOP OR aaa 20160601 20160602 20160603 20160610
BITCOUNT aaa 0 -1