欢迎光临散文网 会员登陆 & 注册

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

2020-10-30 15:20 作者:要宠你上天  | 我要投稿

(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


大数据面试题:redis部分 bit 操作?的评论 (共 条)

分享到微博请遵守国家法律