简介:
在开发中,可能会遇到这种情况:需要统计用户的某些信息,如活跃或不活跃,登录或者不登录;又如需要记录用户一年的打卡情况,打卡了是1
, 没有打卡是
0
,如果使用普通的
key/value
存储,则要记录365条记录,如果用户量很大,需要的空间也会很大,所以
Redis
提供了
Bitmap
位图这中数据结构,Bitmap 就是通过操作二进制位来进行记录,即为
0
和
1
;如果要记录
365
天的打卡情况,使用
Bitmap 表示的形式大概如下:0101000111000111...........................
,这样有什么好处呢?当然就是节约内存 了,365
天相当于
365 bit
,又
1
字节
= 8 bit ,
所以相当于使用
46
个字节即可。
BitMap
就是通过一个
bit
位来表示某个元素对应的值或者状态
,
其中的
key
就是对应元素本身,实际上 底层也是通过对字符串的操作来实现。Redis
从
2.2
版本之后新增了
setbit, getbit, bitcount
等几个
bitmap
相关命令。
setbit设置操作
setbit key offset value :设置key的第offset位value(1或0)
#使用bitmap 来记录上述事例中一周的打卡记录如下所示:#周一:1 周二:0 周三:0 周四:1 周五:1 周六0 周天 0(1为打卡 0为不打卡)127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
getbit获取操作
getbit key offset 获取offset设置的值,未设置多默认返回0
127.0.0.1:6379> getbit sign 3 #查看周四是否打卡
(integer) 1
127.0.0.1:6379> getbit sign 6 #查看周日是否打卡
(integer) 0
bitcount统计操作
bitcount key [start, end]
统计
key
上位为
1
的个数
#统计这周打卡的记录,可以看到只有3天是打卡的状态127.0.0.1:6379> bitcount sign
(integer) 3