一、基础知识
1、概念
说明:用String类型作为底层数据结构实现的一种统计二值状态的数据类型
位图(bitmap)本质是数组,它是基于String数据类型的按位的操作。该数组由多个二进制位组成,每个二进制位都对应一个偏移量(我们可以称之为一个索引或者位格)。Bitmap支持的最大位数是2^32位,它可以极大的节约存储空间,使用512M内存就可以存储多大42.9亿的字节信息(2^32 = 4294967296)
一句话总结:bitmap是由0和1状态表现的二进制位的bit数组。常用于二值统计。
2、优缺点
优点
- 精确计算,结果准确,结果只有0/1。
- 亿级数据的收集和统计,存的进+取得快+多统计。
- 节省存储空间,统计一亿位的Bitmap约占12MB的内存,内存开销低,。(如果这些数据存在mysql中?)
缺点
- 数据量过大的场景,一亿位的Bitmap约占12MB,十亿就是120MB,百亿就是1GB。
3、使用场景
(1)用于状态统计:Y、N,类似AtomicBoolean。
(2)钉钉打卡上下班,签到统计。
(3)日活统计。
(4)某用户按照一年365天,哪几天登陆过?哪几天没有登陆?全年中登录的天数共计多少?
(5)电影、广告是否被点击播放过
二、常见命令
bitmap底层是String,可以用get命令得到二进制的ascii编码
1、setbit
setbit key offset value
key——键
offset——偏移位(Bitmap的偏移位是从0开始算的)
value——值(只能是0和1)
例:
2022年1月18日签到,setbit sign:userId:202201 18 1
2、getbit
getbit key offset
3、bitcount
bitcount key,用于统计全部键里面含有1的有多少个。
常见场景:统计签到次数。
4、strlen
strlen key,用于统计字节长度。不是字符串长度而是占据几个字节,超过8位后自己按照8位一组一byte再扩容。
例:
5、bitop
BITOP operation destkey key [key ...],对一个或多个 key 进行位元操作,并将结果保存到 destkey 上(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
redis> SETBIT k1 0 1 # k1 = 1001 (integer) 0 redis> SETBIT k1 3 1 (integer) 0 redis> SETBIT k2 0 1 # k2 = 1011 (integer) 0 redis> SETBIT k2 1 1 (integer) 0 redis> SETBIT k2 3 1 (integer) 0 redis> BITOP AND and-result k1 k2 (integer) 1 redis> GETBIT and-result 0 # and-result = 1001 (integer) 1 redis> GETBIT and-result 1 (integer) 0 redis> GETBIT and-result 2 (integer) 0 redis> GETBIT and-result 3 (integer) 1