Redis

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
设置后面的位,前面相应补零 大用户量在线用户统计 少用户量时的对比
使用经验
  1. type = string ,最大512M(2.xx版本)。目前是5.xx版本,最大未知
  2. 注意setbit 的偏移量,可能有较大耗时
  3. 位图不是绝对好,应该在合理的场合使用合理的计数
上一篇下一篇

猜你喜欢

热点阅读