Redis下一小节:4-6 HyperLogLog

Redis瑞士军刀之-Bitmap

Bitmap:

  • 位图
  • 相关命令
  • 独立用户统计

1、位图

Redis瑞士军刀之-Bitmap

b的ASCII=98 对应的二进制为:01100010

i的ASCII=105 对应的二进制为:01101001

g的ASCII=103 对应的二进制为:01100111

redi-cli操作:获取big 偏移量offset二进制对应值

127.0.0.1:6379> get hello

"big"

big第一位:0

127.0.0.1:6379> getbit big 0

(integer) 0

big第二位:1

127.0.0.1:6379> getbit hello 1

(integer) 1

big第三位:1

127.0.0.1:6379> getbit hello 2

(integer) 1

127.0.0.1:6379>

 

Redis位图:

Redis瑞士军刀之-Bitmap

2、相关命令

(1)setbit

Redis瑞士军刀之-Bitmap

Redis瑞士军刀之-Bitmap

给位图索引index为:0、5、11、15、19设置为1

127.0.0.1:6379> setbit unique:users:2019-04-14 0 1

(integer) 0

127.0.0.1:6379> setbit unique:users:2019-04-14 5 1

(integer) 0

127.0.0.1:6379> setbit unique:users:2019-04-14 11 1

(integer) 0

127.0.0.1:6379> setbit unique:users:2019-04-14 15 1

(integer) 0

127.0.0.1:6379> setbit unique:users:2019-04-14 19 1

(integer) 0

127.0.0.1:6379>

Redis瑞士军刀之-Bitmap

如果只设置索引index=50的值为1,则位图索引19~49都为0

(2)getbit

Redis瑞士军刀之-Bitmap

获取unique:users:2019-04-14 18和unique:users:2019-04-14 19的值

127.0.0.1:6379> getbit unique:users:2019-04-14 18

(integer) 0

127.0.0.1:6379> getbit unique:users:2019-04-14 19

(integer) 1

(3)bitcount

Redis瑞士军刀之-Bitmap

获取位图unique:users:2019-04-14值为1的个数

127.0.0.1:6379> bitcount unique:users:2019-04-14

(integer) 5

(4)bitop

Redis瑞士军刀之-Bitmap

 

位图交集演示:

127.0.0.1:6379> setbit user1 0 1

(integer) 0

127.0.0.1:6379> getbit user1 0

(integer) 1

127.0.0.1:6379> setbit user2 1 1

(integer) 0

127.0.0.1:6379> getbit user2 1

(integer) 1

127.0.0.1:6379> setbit user1 1 1

(integer) 0

127.0.0.1:6379> bitop and user1:user2 user1 user2

(integer) 1

127.0.0.1:6379> bitcount user1:user2

(integer) 1

(5)bitops

Redis瑞士军刀之-Bitmap

获取位图offset对应value的index:

127.0.0.1:6379> getbit unique:users:2019-04-14 2

(integer) 0

127.0.0.1:6379> bitpos unique:users:2019-04-14 0

(integer) 2

3、独立用户统计

Redis瑞士军刀之-Bitmap

Redis瑞士军刀之-Bitmap

4、使用经验

(1)type=string类型,最大512MB

127.0.0.1:6379> type unique:users:2019-04-14

string

(2)注意setbit时的偏移量,可能有较大耗时

 

(3)位图不是绝对好,合理的场景使用合理的技术

相关文章: