三、Redis新类型之 bitmap

一、基础知识

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

 

posted @ 2022-01-18 14:57  幻月hah  阅读(900)  评论(1编辑  收藏  举报