Bitmap
Bitmap 是 Redis 中的一种数据结构,用于表示位图(bit array),由0和1状态表现的二进制位的bit数组。
bitmap是属于redis的string数据类型,Redis中一个字符串类型的值最多能存储512MB 的内容,每个字符串由多个字节组成,每个字节又由8个Bit 位组成,上限为232次方。(512 * 1024 * 1024 * 8)42.9亿
它通常用于处理大规模数据集中每个元素的状态,比如用户的在线/离线状态(每个用户对应一个位,表示在线(1)或离线(0))、用户签到情况(每天对应一个位,用户当天签到则将该位设为 1)、消息的去重等等。
GETBIT 获取某一位的值
GETBIT key offset
用来获取某一位上的值。
返回值: Integer(整型)某一位上的值0或1。
当偏移量 offset 比字符串的长度大,或者当 key 不存在时,返回默认值0。
当前状态位:
01100001
127.0.0.1:6379> GETBIT k1 0
(integer) 0
127.0.0.1:6379> GETBIT k1 1
(integer) 1
127.0.0.1:6379> GETBIT k1 2
(integer) 1
127.0.0.1:6379> GETBIT k1 3
(integer) 0
127.0.0.1:6379> GETBIT k1 365
(integer) 0
SETBIT 设置某一位的值
SETBIT key offset value
其中 offset 表示偏移量(相当于数组的下标),也是从0开始。
返回值: Integer(整型)返回值为set之前的值(0或1)。
用来设置或者清除某一位上的值,其返回值是原来位上存储的值。key 所有的位的初始状态下都为0,可以自动扩容,最大为40多个亿。
127.0.0.1:6379> SETBIT k1 1 1
(integer) 0
127.0.0.1:6379> SETBIT k1 7 1
(integer) 0
127.0.0.1:6379> get k1
"A"
127.0.0.1:6379> SETBIT k1 2 1
(integer) 0
127.0.0.1:6379> SETBIT k1 3 1
(integer) 0
127.0.0.1:6379> SETBIT k1 3 0
(integer) 1
127.0.0.1:6379> type k1
string
当前状态位:
01100001
STRLEN key 获取占用的字节数
STRLEN key
指定 key 所储存的字符串值的长度。(字节数)
127.0.0.1:6379> SETBIT k2 0 1
(integer) 0
127.0.0.1:6379> SETBIT k2 7 1
(integer) 0
127.0.0.1:6379> STRLEN k2
(integer) 1
127.0.0.1:6379> SETBIT k2 8 1
(integer) 0
127.0.0.1:6379> STRLEN k2
(integer) 2
BITCOUNT 统计为1的数量
BITCOUNT key [start end [BYTE | BIT]]
返回值: 统计为1的数量。
统计key的位上为1的数量,通过指定额外的 start 或 end 参数,可以让计数只在特定的位置上进行。
start 和 end 设置统计的范围,单位默认设置BYTE。可以使用负数值:比如-1表示最后一个位,而-2表示倒数第二个位。start和end的值既可以是正数也可以是负数,正数表示从正序,反之为倒序。
127.0.0.1:6379> SETBIT uid:login123 1 1
(integer) 0
127.0.0.1:6379> SETBIT uid:login123 2 1
(integer) 0
127.0.0.1:6379> SETBIT uid:login123 3 1
(integer) 0
#当前为 01110000
#获取整个key上为1的个数
127.0.0.1:6379> BITCOUNT uid:login123
(integer) 3
# 获取0字节(偏移量为0-7)长度的位置上为1的个数
127.0.0.1:6379> BITCOUNT uid:login123 0 0 BYTE
(integer) 3
# 偏移量为0-1长度的位置上为1的个数
127.0.0.1:6379> BITCOUNT uid:login123 0 1 BIT
(integer) 1
BITOP
BITOP <AND | OR | XOR | NOT> destkey key [key …]
在多个key之间执行逐位地进行位操作,并且将结果存储进指定key中。
operation 参数可选项:AND(逻辑与)、OR(逻辑或)、XOR(逻辑异或)、NOT(逻辑非)(其中NOT操作只接受一个key)。
返回存储在目标键中的字符串长度,该字符串长度等于输入键中对应的字符串中长度最长的值。
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 。
127.0.0.1:6379> SETBIT b1 0 1
(integer) 0
127.0.0.1:6379> SETBIT b1 1 1
(integer) 0
127.0.0.1:6379> SETBIT b2 0 1
(integer) 0
127.0.0.1:6379> SETBIT b2 2 1
(integer) 0
b1: 11000000
b2: 10100000
//and 操作。
127.0.0.1:6379> BITOP and b3 b1 b2
(integer) 1
b3: 10000000