Redis第1️⃣3️⃣课 BitMap 位图
2019-04-30 本文已影响3人
小超_8b2f
位图
命令 | 解释 |
---|---|
getbit | ~ key offset 获取指定偏移量位置的位值 |
setbit | ~ key offset value 给位图指定索引设置值 |
bigcount | ~ key [start end] 获取位图指定范围位值为1的个数 start和end单位是字节,不指定start和end就获取全部 |
bitop | ~ operation destkey key [key ...] 做多个BitMap的and(交集)、or(并集)、not(非)、xor(异或) 操作并将结果保存在destkey中 |
bitpos | ~ key targetBit [start] [end] 计算位图指定范围(start到end,单位为字节,如果不指定就是获取全部)第一个偏移量对应的值等于targetBit的位置 |
字母big的位图,对应上图
127.0.0.1:6379> set hello big
OK
127.0.0.1:6379> getbit hello 0
(integer) 0
127.0.0.1:6379> getbit hello 1
(integer) 1
127.0.0.1:6379> getbit hello 2
(integer) 1
127.0.0.1:6379> getbit hello 3
(integer) 0
127.0.0.1:6379> getbit hello 4
(integer) 0
127.0.0.1:6379> getbit hello 5
(integer) 0
127.0.0.1:6379> getbit hello 6
(integer) 1
127.0.0.1:6379> bitcount hello
(integer) 12
127.0.0.1:6379> setbit hello 7 1
(integer) 0
127.0.0.1:6379> get hello
"cig"
127.0.0.1:6379> bitcount hello
(integer) 13
127.0.0.1:6379> setbit user:2019-04-30 0 1
(integer) 0 #返回结果是之前对应这个位的值
127.0.0.1:6379> setbit user:2019-04-30 5 1
(integer) 0
127.0.0.1:6379> setbit user:2019-04-30 11 1
(integer) 0
127.0.0.1:6379> setbit user:2019-04-30 15 1
(integer) 0
127.0.0.1:6379> setbit user:2019-04-30 19 1
(integer) 0
127.0.0.1:6379> bitcount user:2019-04-30
(integer) 5
127.0.0.1:6379> get user:2019-04-30
"\x84\x11\x10"
127.0.0.1:6379> bitpos hello 1
(integer) 1
127.0.0.1:6379> bitpos hello 0 4 9
(integer) -1
127.0.0.1:6379> bitpos hello 0
(integer) 0
127.0.0.1:6379> bitpos hello 0 4 20
(integer) -1
127.0.0.1:6379> bitpos hello 0 1 4
(integer) 8
示例程序设置效果
设置位图会触发补零操作
所以最好不要在一个很小的位图上往后很多位上设置位图。这不得不补很多零
127.0.0.1:6379> setbit user:2019-04-30 50 1
(integer) 0
127.0.0.1:6379> bitcount user:2019-04-30
(integer) 6
设置后面的位,前面相应补零
大用户量在线用户统计
少用户量时的对比
使用经验
- type = string ,最大512M(2.xx版本)。目前是5.xx版本,最大未知
- 注意setbit 的偏移量,可能有较大耗时
- 位图不是绝对好,应该在合理的场合使用合理的计数